/ Hex Artifact Content
Login

Artifact 1fe7292ce36468a4a08e1d1ecfc8a72dede038aacce03748af755446696720c5:


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 61  se = pParse;.  a
03e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
03f0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
0400: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c  sert( pParse->nL
0410: 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  abel==0 );.  ass
0420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70  ert( pParse->nOp
0430: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0440: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0450: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0470: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 72  ** Change the er
0480: 72 6f 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65  ror string store
0490: 64 20 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73  d in Vdbe.zErrMs
04a0: 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  g.*/.void sqlite
04b0: 33 56 64 62 65 45 72 72 6f 72 28 56 64 62 65 20  3VdbeError(Vdbe 
04c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
04d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
04e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
04f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
0500: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
0510: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0520: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a  zFormat);.  p->z
0530: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0540: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
0550: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0560: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
0570: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
0580: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
0590: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
05a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
05b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
05c0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
05d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
05e0: 75 38 20 70 72 65 70 46 6c 61 67 73 29 7b 0a 20  u8 prepFlags){. 
05f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0600: 72 6e 3b 0a 20 20 70 2d 3e 70 72 65 70 46 6c 61  rn;.  p->prepFla
0610: 67 73 20 3d 20 70 72 65 70 46 6c 61 67 73 3b 0a  gs = prepFlags;.
0620: 20 20 69 66 28 20 28 70 72 65 70 46 6c 61 67 73    if( (prepFlags
0630: 20 26 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52   & SQLITE_PREPAR
0640: 45 5f 53 41 56 45 53 51 4c 29 3d 3d 30 20 29 7b  E_SAVESQL)==0 ){
0650: 0a 20 20 20 20 70 2d 3e 65 78 70 6d 61 73 6b 20  .    p->expmask 
0660: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
0670: 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b  t( p->zSql==0 );
0680: 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c  .  p->zSql = sql
0690: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d  ite3DbStrNDup(p-
06a0: 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f  >db, z, n);.}../
06b0: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06c0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06d0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06e0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06f0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0700: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
0710: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0720: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0730: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
0740: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
0750: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0760: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0770: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0780: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0790: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07a0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07b0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07c0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07d0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07e0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07f0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0800: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0810: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0820: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0830: 70 3b 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73 6b  p;.  pB->expmask
0840: 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a   = pA->expmask;.
0850: 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73 20    pB->prepFlags 
0860: 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73 3b  = pA->prepFlags;
0870: 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61 43  .  memcpy(pB->aC
0880: 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f 75  ounter, pA->aCou
0890: 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42 2d  nter, sizeof(pB-
08a0: 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20 70  >aCounter));.  p
08b0: 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49  B->aCounter[SQLI
08c0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45  TE_STMTSTATUS_RE
08d0: 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f  PREPARE]++;.}../
08e0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
08f0: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0900: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0910: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0920: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0930: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0940: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0950: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0960: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0970: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0980: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
0990: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09b0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09c0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09d0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
09e0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
09f0: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a00: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a10: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a20: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a30: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a40: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a50: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a60: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a70: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0a80: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0a90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0aa0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ab0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ac0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0ad0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0ae0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0af0: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b00: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b10: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b20: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b30: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b40: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b50: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b60: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b70: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0b80: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0b90: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ba0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bb0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0bc0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bd0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0be0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0bf0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c00: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c10: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c20: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c30: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c40: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c50: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c60: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c70: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0c80: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0c90: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0ca0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cb0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0cc0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cd0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0ce0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0cf0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d10: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d20: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d30: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d50: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d60: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d70: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0d80: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0d90: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0da0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0db0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0dc0: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
0dd0: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
0de0: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
0df0: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
0e00: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
0e10: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
0e20: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
0e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
0e40: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
0e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
0e60: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
0e70: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
0e80: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
0e90: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
0ea0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0eb0: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
0ec0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
0ed0: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
0ee0: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
0ef0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
0f00: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
0f10: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0f20: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0f30: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
0f40: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
0f50: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0f60: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0f70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0f80: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0f90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
0fa0: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
0fb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0fd0: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0fe0: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0ff0: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1000: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1010: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1020: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1030: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
1040: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
1050: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
1060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
1070: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
1080: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
1090: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
10a0: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
10b0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
10c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
10d0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
10e0: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
10f0: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1100: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1110: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1120: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1130: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
1140: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
1150: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
1160: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
1170: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
1180: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
1190: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
11a0: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
11b0: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
11c0: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
11d0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
11e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
11f0: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1200: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1210: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1220: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1230: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
1240: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
1250: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
1260: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
1270: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
1280: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1290: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
12a0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
12b0: 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65  ssert( p->pParse
12c0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e  ->nOpAlloc<=p->n
12d0: 4f 70 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77  Op );.  if( grow
12e0: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 20  OpArray(p, 1) ) 
12f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65  return 1;.  asse
1300: 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e  rt( p->pParse->n
1310: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1330: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1340: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1350: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1360: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
1370: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1380: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
1390: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
13a0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
13b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
13c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
13d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
13e0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
13f0: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1400: 20 69 66 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e   if( p->pParse->
1410: 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20  nOpAlloc<=i ){. 
1420: 20 20 20 72 65 74 75 72 6e 20 67 72 6f 77 4f 70     return growOp
1430: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1440: 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e   p3);.  }.  p->n
1450: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
1460: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
1470: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
1480: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
1490: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
14a0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
14b0: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
14c0: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
14d0: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
14e0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
14f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1500: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
1510: 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  NTS.  pOp->zComm
1520: 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ent = 0;.#endif.
1530: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1540: 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  BUG.  if( p->db-
1550: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1560: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1570: 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b  {.    int jj, kk
1580: 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61  ;.    Parse *pPa
1590: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
15a0: 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30  .    for(jj=kk=0
15b0: 3b 20 6a 6a 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  ; jj<pParse->nCo
15c0: 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20  lCache; jj++){. 
15d0: 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c       struct yCol
15e0: 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72 73  Cache *x = pPars
15f0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a  e->aColCache + j
1600: 6a 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  j;.      printf(
1610: 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22  " r[%d]={%d:%d}"
1620: 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54  , x->iReg, x->iT
1630: 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e  able, x->iColumn
1640: 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20  );.      kk++;. 
1650: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20     }.    if( kk 
1660: 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ) printf("\n");.
1670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
1680: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
1690: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65  >aOp[i]);.    te
16a0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
16b0: 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  int();.  }.#endi
16c0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
16d0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
16e0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
16f0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
1700: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
1710: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f  BE_COVERAGE.  pO
1720: 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b  p->iSrcLine = 0;
1730: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1740: 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   i;.}.int sqlite
1750: 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65  3VdbeAddOp0(Vdbe
1760: 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   *p, int op){.  
1770: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1780: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1790: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
17a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17b0: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  1(Vdbe *p, int o
17c0: 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65  p, int p1){.  re
17d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
17e0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
17f0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1810: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1820: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1830: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1840: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1850: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b   op, p1, p2, 0);
1860: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1870: 63 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f  code for an unco
1880: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
1890: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44  o instruction iD
18a0: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18b0: 65 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20  e3VdbeGoto(Vdbe 
18c0: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a  *p, int iDest){.
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 4f 50  VdbeAddOp3(p, OP
18f0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c  _Goto, 0, iDest,
1900: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
1910: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73  ate code to caus
1920: 65 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74  e the string zSt
1930: 72 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69  r to be loaded i
1940: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  nto.** register 
1950: 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iDest.*/.int sql
1960: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1970: 6e 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ng(Vdbe *p, int 
1980: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1990: 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75  r *zStr){.  retu
19a0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
19b0: 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(p, OP_Strin
19c0: 67 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c  g8, 0, iDest, 0,
19d0: 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a   zStr, 0);.}../*
19e0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19f0: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
1a00: 65 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69  es multiple regi
1a10: 73 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20  sters to string 
1a20: 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f  or integer.** co
1a30: 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65  nstants.  The re
1a40: 67 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69  gisters begin wi
1a50: 74 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63  th iDest and inc
1a60: 72 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76  rease consecutiv
1a70: 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69  ely..** One regi
1a80: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1a90: 7a 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61  zed for each cha
1aa0: 72 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65  racgter in zType
1ab0: 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a  s[].  For each.*
1ac0: 2a 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20  * "s" character 
1ad0: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1ae0: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73   register is a s
1af0: 74 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67  tring if the arg
1b00: 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  ument is.** not 
1b10: 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c  NULL, or OP_Null
1b20: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1b30: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
1b40: 20 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63    For each "i" c
1b50: 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a  haracter.** in z
1b60: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b70: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
1b80: 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  ized to an integ
1b90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1ba0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f   input string do
1bb0: 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20  es not end with 
1bc0: 22 58 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52  "X" then an OP_R
1bd0: 65 73 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63  esultRow instruc
1be0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72  tion.** is gener
1bf0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c  ated for the val
1c00: 75 65 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f  ues inserted..*/
1c10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1c20: 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20  eMultiLoad(Vdbe 
1c30: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63  *p, int iDest, c
1c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1c50: 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  s, ...){.  va_li
1c60: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  st ap;.  int i;.
1c70: 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73    char c;.  va_s
1c80: 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29  tart(ap, zTypes)
1c90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20  ;.  for(i=0; (c 
1ca0: 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b  = zTypes[i])!=0;
1cb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   i++){.    if( c
1cc0: 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63  =='s' ){.      c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76  onst char *z = v
1ce0: 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1cf0: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
1d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d10: 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c  p, z==0 ? OP_Nul
1d20: 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  l : OP_String8, 
1d30: 30 2c 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a  0, iDest+i, 0, z
1d40: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , 0);.    }else 
1d50: 69 66 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20  if( c=='i' ){.  
1d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d70: 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65  ddOp2(p, OP_Inte
1d80: 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20  ger, va_arg(ap, 
1d90: 69 6e 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a  int), iDest+i);.
1da0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1db0: 20 67 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65   goto skip_op_re
1dc0: 73 75 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20  sultrow;.    }. 
1dd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1de0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73  AddOp2(p, OP_Res
1df0: 75 6c 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69  ultRow, iDest, i
1e00: 29 3b 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c  );.skip_op_resul
1e10: 74 72 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61  trow:.  va_end(a
1e20: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  p);.}../*.** Add
1e30: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1e40: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1e50: 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74  value as a point
1e60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e70: 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
1e80: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
1e90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
1ea0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
1eb0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ed0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1ee0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1f00: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1f10: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1f20: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1f30: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
1f60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1f70: 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20  4,    /* The P4 
1f80: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1f90: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
1fa0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
1fb0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ype */.){.  int 
1fc0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1fd0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1fe0: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73  p1, p2, p3);.  s
1ff0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2000: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c  P4(p, addr, zP4,
2010: 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75   p4type);.  retu
2020: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
2030: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2040: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2050: 65 20 70 34 20 76 61 6c 75 65 20 77 69 74 68 20  e p4 value with 
2060: 61 20 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a  a P4_INT64 or.**
2070: 20 50 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a   P4_REAL type..*
2080: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2090: 65 41 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56  eAddOp4Dup8(.  V
20a0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
20b0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
20c0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
20d0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20f0: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2100: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2110: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2120: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2130: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2140: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2150: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2170: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2180: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20   const u8 *zP4, 
2190: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
21a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
21b0: 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20  p4type          
21c0: 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79  /* P4 operand ty
21d0: 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  pe */.){.  char 
21e0: 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65  *p4copy = sqlite
21f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73  3DbMallocRawNN(s
2200: 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 2c  qlite3VdbeDb(p),
2210: 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70   8);.  if( p4cop
2220: 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70  y ) memcpy(p4cop
2230: 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65  y, zP4, 8);.  re
2240: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
2250: 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31  AddOp4(p, op, p1
2260: 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79  , p2, p3, p4copy
2270: 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  , p4type);.}../*
2280: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
2290: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
22a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22b0: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
22c0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
22d0: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
22e0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
22f0: 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61   needs to mark a
2300: 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20  ll btrees.** as 
2310: 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64  having been used
2320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65  ..**.** The zWhe
2330: 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68  re string must h
2340: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
2350: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2360: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73  alloc()..** This
2370: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61   routine will ta
2380: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ke ownership of 
2390: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
23a0: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
23b0: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
23c0: 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a  eSchemaOp(Vdbe *
23d0: 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  p, int iDb, char
23e0: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *zWhere){.  int
23f0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   j;.  sqlite3Vdb
2400: 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61  eAddOp4(p, OP_Pa
2410: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
2420: 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34  0, 0, zWhere, P4
2430: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
2440: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
2450: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
2460: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
2470: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
2480: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2490: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
24a0: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
24b0: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
24c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
24d0: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
24e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
24f0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2500: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2510: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2520: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
2530: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
2540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2550: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
2560: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
2570: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
2580: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2590: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
25a0: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
25b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25d0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
25e0: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
25f0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
2600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2610: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
2620: 33 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  3);.  if( p->db-
2630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
2640: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
2650: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
2660: 64 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  dr];.    pOp->p4
2670: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
2680: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
2690: 20 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   p4;.  }.  retur
26a0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e  n addr;.}../* In
26b0: 73 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20  sert the end of 
26c0: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a  a co-routine.*/.
26d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
26e0: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62  EndCoroutine(Vdb
26f0: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65  e *v, int regYie
2700: 6c 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ld){.  sqlite3Vd
2710: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
2720: 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
2730: 59 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Yield);..  /* Cl
2740: 65 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ear the temporar
2750: 79 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65  y register cache
2760: 2c 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69  , thereby ensuri
2770: 6e 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a  ng that each.  *
2780: 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73  * co-routine has
2790: 20 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e   its own indepen
27a0: 64 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69  dent set of regi
27b0: 73 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63  sters, because c
27c0: 6f 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20  o-routines.  ** 
27d0: 6d 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65  might expect the
27e0: 69 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ir registers to 
27f0: 62 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72  be preserved acr
2800: 6f 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c  oss an OP_Yield,
2810: 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63   and.  ** that c
2820: 6f 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c  ould cause probl
2830: 65 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f  ems if two or mo
2840: 72 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61  re co-routines a
2850: 72 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  re using the sam
2860: 65 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  e.  ** temporary
2870: 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a   register..  */.
2880: 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65    v->pParse->nTe
2890: 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e  mpReg = 0;.  v->
28a0: 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
28b0: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
28c0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
28d0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
28e0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
28f0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
2900: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
2910: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
2920: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
2930: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2940: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
2950: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
2960: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
2970: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
2980: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
2990: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
29a0: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
29b0: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
29c0: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
29d0: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
29e0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
29f0: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
2a00: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
2a10: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
2a20: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
2a30: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
2a40: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
2a50: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
2a60: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
2a70: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
2a80: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
2a90: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
2aa0: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
2ab0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
2ac0: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
2ad0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
2ae0: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
2af0: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
2b00: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
2b10: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2b20: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
2b30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2b40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
2b50: 65 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a  e *v){.  Parse *
2b60: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20  p = v->pParse;. 
2b70: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
2b80: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
2b90: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2ba0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2bb0: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
2bc0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
2bd0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
2be0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
2bf0: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->aLabel, . 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69        (i*2+1)*si
2c30: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
2c40: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
2c50: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2c60: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
2c70: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2c80: 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ADDR(i);.}../*.*
2c90: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
2ca0: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
2cb0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2cc0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2cd0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
2ce0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
2cf0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
2d00: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d10: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
2d20: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
2d30: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
2d40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2d50: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
2d60: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
2d70: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
2d80: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
2d90: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
2da0: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
2db0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2dc0: 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c   assert( j<p->nL
2dd0: 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  abel );.  assert
2de0: 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( j>=0 );.  if( 
2df0: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
2e00: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
2e10: 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  v->nOp;.  }.}../
2e20: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
2e30: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
2e40: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
2e50: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
2e60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
2e70: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
2e80: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
2e90: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 1;.}../*.**
2ea0: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
2eb0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
2ec0: 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69  nly be run multi
2ed0: 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f  ple times..*/.vo
2ee0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
2ef0: 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b  usable(Vdbe *p){
2f00: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2f10: 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 0;.}..#ifdef
2f20: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2f30: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2f40: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2f50: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2f60: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2f70: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2f80: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2f90: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2fa0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
2fb0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
2fc0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
2fd0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2fe0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2ff0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
3000: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
3010: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
3020: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
3030: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
3040: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
3050: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
3060: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
3070: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
3080: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
30b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
30c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
30d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
30e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
30f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
3100: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
3110: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
3120: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
3130: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
3140: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3150: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
3160: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
3170: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
3180: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
3190: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
31a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
31b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
31c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
31d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
31e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
31f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
3200: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
3210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3220: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3230: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
3240: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
3250: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
3260: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
3270: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
3280: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
32b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
32c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
32d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
32e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
32f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
3300: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
3310: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
3320: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
3330: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
3340: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
3350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
3360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
3370: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
3380: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
3390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
33b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
33c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
33d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
33e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
33f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
3400: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
3410: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
3420: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
3430: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
3440: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
3450: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
3460: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
3470: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
3480: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
3490: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
34a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
34b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
34c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
34d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
34e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
34f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
3500: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
3510: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
3520: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
3530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3540: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
3550: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
3560: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
3570: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
3580: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
3590: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
35a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
35b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
35c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
35d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
35e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
35f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
3600: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
3610: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3620: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
3630: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
3640: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
3650: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
3660: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
3670: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
3680: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
3690: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
36a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
36b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
36c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
36d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
36e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
36f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
3700: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
3710: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
3720: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
3730: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
3740: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
3750: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
3760: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
3770: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
3780: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
3790: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
37a0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
37b0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
37c0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
37d0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
37e0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
37f0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
3800: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
3810: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
3820: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
3830: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
3840: 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74  **   *  OP_Creat
3850: 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e  eTable and OP_In
3860: 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72  itCoroutine (for
3870: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 53   CREATE TABLE AS
3880: 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a   SELECT ...).**.
3890: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
38a0: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
38b0: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
38c0: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
38d0: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
38e0: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
38f0: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
3900: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
3910: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
3920: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
3930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
3940: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
3950: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
3960: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
3970: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
3980: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
3990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
39a0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
39b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
39c0: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
39d0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
39e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
39f0: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
3a00: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
3a10: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
3a20: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69  asAbort = 0;.  i
3a30: 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20  nt hasFkCounter 
3a40: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72  = 0;.  int hasCr
3a50: 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20  eateTable = 0;. 
3a60: 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f   int hasInitCoro
3a70: 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20  utine = 0;.  Op 
3a80: 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74  *pOp;.  VdbeOpIt
3a90: 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73  er sIter;.  mems
3aa0: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
3ab0: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20  zeof(sIter));.  
3ac0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20  sIter.v = v;..  
3ad0: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
3ae0: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
3af0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
3b00: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
3b10: 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70  code;.    if( op
3b20: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
3b30: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
3b40: 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65  Update || opcode
3b50: 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20  ==OP_VRename .  
3b60: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
3b70: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
3b80: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
3b90: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
3ba0: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
3bb0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
3bc0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
3bd0: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
3be0: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
3bf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3c00: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
3c10: 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62  de==OP_CreateTab
3c20: 6c 65 20 29 20 68 61 73 43 72 65 61 74 65 54 61  le ) hasCreateTa
3c30: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ble = 1;.    if(
3c40: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74   opcode==OP_Init
3c50: 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49  Coroutine ) hasI
3c60: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  nitCoroutine = 1
3c70: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3c80: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
3c90: 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  Y.    if( opcode
3ca0: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
3cb0: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
3cc0: 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20  pOp->p2==1 ){.  
3cd0: 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72      hasFkCounter
3ce0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
3cf0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
3d00: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3d10: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
3d20: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
3d30: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3d40: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
3d50: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
3d60: 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  rred..  ** If ma
3d70: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
3d80: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
3d90: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
3da0: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
3db0: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
3dc0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
3dd0: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
3de0: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
3df0: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
3e00: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
3e10: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
3e20: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
3e30: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
3e40: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
3e50: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
3e60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
3e70: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
3e80: 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75  bort || hasFkCou
3e90: 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  nter.           
3ea0: 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65     || (hasCreate
3eb0: 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74  Table && hasInit
3ec0: 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a  Coroutine) );.}.
3ed0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3ee0: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
3ef0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
3f00: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
3f10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3f20: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
3f30: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
3f40: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
3f50: 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a  ted.  It loops.*
3f60: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  * through all th
3f70: 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69  e opcodes and fi
3f80: 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61  xes up some deta
3f90: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46  ils..**.** (1) F
3fa0: 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73  or each jump ins
3fb0: 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20  truction with a 
3fc0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
3fd0: 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20  e (a label).**  
3fe0: 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50     resolve the P
3ff0: 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63  2 value to an ac
4000: 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a  tual address..**
4010: 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20  .** (2) Compute 
4020: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
4030: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4040: 75 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20  used by any SQL 
4050: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  function.**     
4060: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
4070: 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e  alue in *pMaxFun
4080: 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29  cArgs..**.** (3)
4090: 20 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65   Update the Vdbe
40a0: 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64  .readOnly and Vd
40b0: 62 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61  be.bIsReader fla
40c0: 67 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  gs to accurately
40d0: 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65  .**     indicate
40e0: 20 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72   what the prepar
40f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74  ed statement act
4100: 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a  ually does..**.*
4110: 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65  * (4) Initialize
4120: 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65   the p4.xAdvance
4130: 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f   pointer on opco
4140: 64 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e  des that use it.
4150: 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61  .**.** (5) Recla
4160: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  im the memory al
4170: 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72  located for stor
4180: 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a  ing labels..**.*
4190: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
41a0: 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  ill only functio
41b0: 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74  n correctly if t
41c0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
41d0: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63   generator.** sc
41e0: 72 69 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65  ript numbers the
41f0: 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74   opcodes correct
4200: 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20  ly.  Changes to 
4210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
4220: 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61  t be.** coordina
4230: 74 65 64 20 77 69 74 68 20 63 68 61 6e 67 65 73  ted with changes
4240: 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63   to mkopcodeh.tc
4250: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
4260: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
4270: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
4280: 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20  pMaxFuncArgs){. 
4290: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
42a0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
42b0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
42c0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
42d0: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
42e0: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
42f0: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
4300: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
4310: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
4320: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  pOp = &p->aOp[p-
4330: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65  >nOp-1];.  while
4340: 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  (1){..    /* Onl
4350: 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61  y JUMP opcodes a
4360: 6e 64 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73  nd the short lis
4370: 74 20 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63  t of special opc
4380: 6f 64 65 73 20 69 6e 20 74 68 65 20 73 77 69 74  odes in the swit
4390: 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20  ch.    ** below 
43a0: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
43b0: 64 65 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70  dered.  The mkop
43c0: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
43d0: 74 6f 72 20 73 63 72 69 70 74 20 67 72 6f 75 70  tor script group
43e0: 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  s.    ** all the
43f0: 73 65 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74  se opcodes toget
4400: 68 65 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f  her near the fro
4410: 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nt of the opcode
4420: 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20   list.  Skip.   
4430: 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74   ** any opcode t
4440: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
4450: 64 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  d processing by 
4460: 76 69 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66  virtual of the f
4470: 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
4480: 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  it is larger tha
4490: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
44a0: 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65  _OPCODE, as a pe
44b0: 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
44c0: 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  zation..    */. 
44d0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
44e0: 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  de<=SQLITE_MX_JU
44f0: 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20  MP_OPCODE ){.   
4500: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
4510: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
4520: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e  opcodeh.tcl when
4530: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
4540: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73  ing.      ** cas
4550: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
4560: 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77  tch! */.      sw
4570: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
4580: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
4590: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
45a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
45b0: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
45c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
45d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c            /* fal
45e0: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
45f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
4600: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
4610: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4620: 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20  Savepoint: {.   
4630: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
4640: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
4650: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4660: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
4670: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
4680: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
4690: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
46a0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
46b0: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63  acuum:.        c
46c0: 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  ase OP_JournalMo
46d0: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  de: {.          
46e0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
46f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
4700: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4720: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4730: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4740: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
4750: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
4760: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
4770: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
4780: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
4790: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
47a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
47b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
47c0: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
47d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
47e0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
47f0: 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  ( (pOp - p->aOp)
4800: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
4810: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
4820: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
4830: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
4840: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
4850: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
4860: 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d   n>nMaxArgs ) nM
4870: 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20  axArgs = n;.    
4880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4890: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
48a0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
48b0: 78 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  xt:.        case
48c0: 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a   OP_NextIfOpen:.
48d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
48e0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
48f0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
4900: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
4910: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
4920: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
4930: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
4940: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4960: 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76      case OP_Prev
4970: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4980: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
4990: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
49a0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
49b0: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
49c0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
49d0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
49e0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
49f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4a00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4a10: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
4a20: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
4a30: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
4a40: 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d  JUMP)!=0 && pOp-
4a50: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  >p2<0 ){.       
4a60: 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f   assert( ADDR(pO
4a70: 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e 6e  p->p2)<pParse->n
4a80: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 20  Label );.       
4a90: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
4aa0: 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d  l[ADDR(pOp->p2)]
4ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4ac0: 20 20 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e      if( pOp==p->
4ad0: 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  aOp ) break;.   
4ae0: 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71   pOp--;.  }.  sq
4af0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
4b00: 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  b, pParse->aLabe
4b10: 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c  l);.  pParse->aL
4b20: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72  abel = 0;.  pPar
4b30: 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->nLabel = 0;.
4b40: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
4b50: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73  = nMaxArgs;.  as
4b60: 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
4b70: 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41  er!=0 || DbMaskA
4b80: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4b90: 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ask) );.}../*.**
4ba0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
4bb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
4bc0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
4bd0: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
4be0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
4bf0: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
4c00: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
4c10: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4c20: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
4c30: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
4c40: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
4c50: 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f   at least N opco
4c60: 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61  de slots are ava
4c70: 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68  ilable in p with
4c80: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
4c90: 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65   malloc for more
4ca0: 20 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77   space (except w
4cb0: 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69  hen compiled usi
4cc0: 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  ng.** SQLITE_TES
4cd0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
4ce0: 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61  ).  This interfa
4cf0: 63 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  ce is used durin
4d00: 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20  g testing.** to 
4d10: 76 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  verify that cert
4d20: 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ain calls to sql
4d30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
4d40: 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a  t() can never.**
4d50: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f   fail due to a O
4d60: 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e  OM fault and hen
4d70: 63 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ce that the retu
4d80: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  rn value from.**
4d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4da0: 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77  pList() will alw
4db0: 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e  ays be non-NULL.
4dc0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
4dd0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
4de0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4df0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
4e00: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
4e10: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
4e20: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62  llocRequired(Vdb
4e30: 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  e *p, int N){.  
4e40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b  assert( p->nOp +
4e50: 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d   N <= p->pParse-
4e60: 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23  >nOpAlloc );.}.#
4e70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  endif../*.** Ver
4e80: 69 66 79 20 74 68 61 74 20 74 68 65 20 56 4d 20  ify that the VM 
4e90: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
4ea0: 6c 79 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73  ly argument does
4eb0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   not contain.** 
4ec0: 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  an OP_ResultRow 
4ed0: 6f 70 63 6f 64 65 2e 20 46 61 69 6c 20 61 6e 20  opcode. Fail an 
4ee0: 61 73 73 65 72 74 28 29 20 69 66 20 69 74 20 64  assert() if it d
4ef0: 6f 65 73 2e 20 54 68 69 73 20 69 73 20 75 73 65  oes. This is use
4f00: 64 0a 2a 2a 20 62 79 20 63 6f 64 65 20 69 6e 20  d.** by code in 
4f10: 70 72 61 67 6d 61 2e 63 20 74 6f 20 65 6e 73 75  pragma.c to ensu
4f20: 72 65 20 74 68 61 74 20 74 68 65 20 69 6d 70 6c  re that the impl
4f30: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 63 65  ementation of ce
4f40: 72 74 61 69 6e 0a 2a 2a 20 70 72 61 67 6d 61 73  rtain.** pragmas
4f50: 20 63 6f 6d 70 6f 72 74 73 20 77 69 74 68 20 74   comports with t
4f60: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
4f70: 65 64 20 69 6e 20 74 68 65 20 6d 6b 70 72 61 67  ed in the mkprag
4f80: 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a 20 73 63 72  matab.tcl.** scr
4f90: 69 70 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ipt..*/.#if defi
4fa0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
4fb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
4fc0: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
4fd0: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73  C_STRESS).void s
4fe0: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
4ff0: 4e 6f 52 65 73 75 6c 74 52 6f 77 28 56 64 62 65  NoResultRow(Vdbe
5000: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
5010: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5020: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  Op; i++){.    as
5030: 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e  sert( p->aOp[i].
5040: 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 65 73 75 6c  opcode!=OP_Resul
5050: 74 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  tRow );.  }.}.#e
5060: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
5070: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5080: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
5090: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
50a0: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
50b0: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
50c0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
50d0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
50e0: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
50f0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
5100: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
5110: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
5120: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
5130: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
5140: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
5150: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
5160: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
5170: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
5180: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
5190: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
51a0: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
51b0: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
51c0: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
51d0: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
51e0: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
51f0: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
5200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
5210: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
5220: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
5230: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
5240: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
5250: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
5260: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
5270: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
5280: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
5290: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
52a0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
52b0: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
52c0: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
52d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
52e0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
52f0: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
5300: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
5310: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
5320: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
5330: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
5340: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
5350: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
5360: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
5370: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
5380: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
5390: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
53a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
53b0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
53c0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
53d0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
53e0: 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f    Return a.** po
53f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
5400: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73  st operation ins
5410: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e  erted..**.** Non
5420: 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e  -zero P2 argumen
5430: 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72  ts to jump instr
5440: 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f  uctions are auto
5450: 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74  matically adjust
5460: 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  ed.** so that th
5470: 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73  e jump target is
5480: 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65   relative to the
5490: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
54a0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64   inserted..*/.Vd
54b0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
54c0: 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64  eAddOpList(.  Vd
54d0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
54e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
54f0: 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65  d opcodes to the
5500: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
5510: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70  ent */.  int nOp
5520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5530: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5540: 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64  of opcodes to ad
5550: 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73  d */.  VdbeOpLis
5560: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20  t const *aOp,   
5570: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
5580: 65 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  es to be added *
5590: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20  /.  int iLineno 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20   /* Source-file 
55c0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  line number of f
55d0: 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29  irst opcode */.)
55e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
55f0: 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72  eOp *pOut, *pFir
5600: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
5610: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
5620: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5630: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5640: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
5650: 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f   > p->pParse->nO
5660: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
5670: 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b  Array(p, nOp) ){
5680: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5690: 20 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f   }.  pFirst = pO
56a0: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  ut = &p->aOp[p->
56b0: 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nOp];.  for(i=0;
56c0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70   i<nOp; i++, aOp
56d0: 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20  ++, pOut++){.   
56e0: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
56f0: 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  aOp->opcode;.   
5700: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d   pOut->p1 = aOp-
5710: 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p1;.    pOut->p
5720: 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20  2 = aOp->p2;.   
5730: 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32   assert( aOp->p2
5740: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  >=0 );.    if( (
5750: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5760: 70 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64  perty[aOp->opcod
5770: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
5780: 21 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30  !=0 && aOp->p2>0
5790: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
57a0: 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  p2 += p->nOp;.  
57b0: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33    }.    pOut->p3
57c0: 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = aOp->p3;.    
57d0: 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50  pOut->p4type = P
57e0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70  4_NOTUSED;.    p
57f0: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
5800: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
5810: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5820: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
5830: 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d  MMENTS.    pOut-
5840: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
5850: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
5860: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
5870: 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63  E.    pOut->iSrc
5880: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69  Line = iLineno+i
5890: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69  ;.#else.    (voi
58a0: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
58b0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
58c0: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d  DEBUG.    if( p-
58d0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
58e0: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
58f0: 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ce ){.      sqli
5900: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
5910: 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e  , i+p->nOp, &p->
5920: 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a  aOp[i+p->nOp]);.
5930: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5940: 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70  .  p->nOp += nOp
5950: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 73  ;.  return pFirs
5960: 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  t;.}..#if define
5970: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
5980: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
5990: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
59a0: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
59b0: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
59c0: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
59d0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
59e0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
59f0: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
5a00: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
5a30: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
5a40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
5a50: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
5a60: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
5a70: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
5a80: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
5a90: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
5aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
5ab0: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
5ac0: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
5ad0: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5af0: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
5b00: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
5b10: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
5b40: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
5b50: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
5b60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5b80: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
5b90: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
5ba0: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
5bb0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
5bc0: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
5bd0: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
5be0: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
5bf0: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
5c00: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
5c10: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
5c20: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
5c30: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
5c40: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
5c50: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
5c60: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
5c70: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
5c80: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
5c90: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
5ca0: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
5cb0: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
5cc0: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
5cd0: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
5ce0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
5cf0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5d00: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
5d10: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
5d20: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
5d30: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
5d40: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
5d50: 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72  f the opcode, or
5d60: 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20   P1, P2, P3, or 
5d70: 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66  P5 operands.** f
5d80: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5d90: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
5da0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5db0: 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20  angeOpcode(Vdbe 
5dc0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38  *p, u32 addr, u8
5dd0: 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20   iNewOpcode){.  
5de0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5df0: 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65  (p,addr)->opcode
5e00: 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d   = iNewOpcode;.}
5e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5e20: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
5e30: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5e40: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5e50: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5e60: 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p1 = val;.}.v
5e70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5e80: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
5e90: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5ea0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5eb0: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
5ec0: 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p2 = val;.}.voi
5ed0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
5ee0: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
5ef0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
5f00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5f10: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5f20: 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  3 = val;.}.void 
5f30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5f40: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36  eP5(Vdbe *p, u16
5f50: 20 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20   p5){.  assert( 
5f60: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64  p->nOp>0 || p->d
5f70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5f80: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
5f90: 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  0 ) p->aOp[p->nO
5fa0: 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a  p-1].p5 = p5;.}.
5fb0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5fc0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
5fd0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
5fe0: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
5ff0: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
6000: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
6010: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
6020: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
6030: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
6040: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
6050: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
6060: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
6070: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
6080: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
6090: 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66  he input FuncDef
60a0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
60b0: 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72  hemeral, then fr
60c0: 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  ee it.  If.** th
60d0: 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74  e FuncDef is not
60e0: 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20   ephermal, then 
60f0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73  do nothing..*/.s
6100: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
6110: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
6120: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
6130: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
6140: 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
6150: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
6160: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
6170: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6180: 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  eNN(db, pDef);. 
6190: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
61a0: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
61b0: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
61c0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
61d0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
61e0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
61f0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
6200: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66  _NOINLINE void f
6210: 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33  reeP4Mem(sqlite3
6220: 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20   *db, Mem *p){. 
6230: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
6240: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
6250: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
6260: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
6270: 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74  eNN(db, p);.}.st
6280: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
6290: 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34  LINE void freeP4
62a0: 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20  FuncCtx(sqlite3 
62b0: 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e  *db, sqlite3_con
62c0: 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65  text *p){.  free
62d0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
62e0: 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b  n(db, p->pFunc);
62f0: 0a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e  . sqlite3DbFreeN
6300: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74  N(db, p);.}.stat
6310: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
6320: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6330: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
6340: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20  ){.  assert( db 
6350: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74  );.  switch( p4t
6360: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
6370: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
6380: 20 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74      freeP4FuncCt
6390: 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63  x(db, (sqlite3_c
63a0: 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20  ontext*)p4);.   
63b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
63c0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
63d0: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  :.    case P4_IN
63e0: 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34  T64:.    case P4
63f0: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61  _DYNAMIC:.    ca
6400: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6410: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6420: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
6430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6440: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  }.    case P4_KE
6450: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6460: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
6470: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
6480: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65  KeyInfoUnref((Ke
6490: 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20  yInfo*)p4);.    
64a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
64b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
64c0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
64d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
64e0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
64f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6500: 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20   (Expr*)p4);.   
6510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6520: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6530: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
6540: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
6550: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
6560: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
6570: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6580: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
6590: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
65a0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
65b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
65c0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
65d0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
65e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
65f0: 20 20 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d         freeP4Mem
6600: 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a  (db, (Mem*)p4);.
6610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6620: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6630: 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a  ase P4_VTAB : {.
6640: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
6650: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
6660: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
6670: 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b  k((VTable *)p4);
6680: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6690: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
66a0: 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20   Free the space 
66b0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f  allocated for aO
66c0: 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c  p and any p4 val
66d0: 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ues allocated fo
66e0: 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73  r the.** opcodes
66f0: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
6700: 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74  n. If aOp is not
6710: 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75   NULL it is assu
6720: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a  med to contain .
6730: 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20  ** nOp entries. 
6740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6750: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
6760: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20  sqlite3 *db, Op 
6770: 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  *aOp, int nOp){.
6780: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
6790: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f   Op *pOp;.    fo
67a0: 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31  r(pOp=&aOp[nOp-1
67b0: 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70  ]; pOp>=aOp; pOp
67c0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  --){.      if( p
67d0: 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50 34  Op->p4type <= P4
67e0: 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29 20 66 72  _FREE_IF_LE ) fr
67f0: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
6800: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6810: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6820: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6830: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
6840: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6850: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6860: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
6870: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
6880: 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b 0a  reeNN(db, aOp);.
6890: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e    }.}../*.** Lin
68a0: 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d  k the SubProgram
68b0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
68c0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
68d0: 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c  ument into the l
68e0: 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74  inked.** list at
68f0: 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61   Vdbe.pSubProgra
6900: 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20  m. This list is 
6910: 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61  used to delete a
6920: 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a  ll sub-program.*
6930: 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74  * objects when t
6940: 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67  he VM is no long
6950: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
6960: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6970: 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56  LinkSubProgram(V
6980: 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50  dbe *pVdbe, SubP
6990: 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d  rogram *p){.  p-
69a0: 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e  >pNext = pVdbe->
69b0: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62  pProgram;.  pVdb
69c0: 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b  e->pProgram = p;
69d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
69e0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61   the opcode at a
69f0: 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70  ddr into OP_Noop
6a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
6a10: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6a20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
6a30: 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  r){.  VdbeOp *pO
6a40: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  p;.  if( p->db->
6a50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
6a60: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
6a70: 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64  t( addr>=0 && ad
6a80: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70  dr<p->nOp );.  p
6a90: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
6aa0: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e  r];.  freeP4(p->
6ab0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
6ac0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
6ad0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6ae0: 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e  NOTUSED;.  pOp->
6af0: 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.z = 0;.  pOp-
6b00: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
6b10: 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  p;.  return 1;.}
6b20: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ../*.** If the l
6b30: 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f  ast opcode is "o
6b40: 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  p" and it is not
6b50: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
6b60: 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d  ion,.** then rem
6b70: 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20  ove it.  Return 
6b80: 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79  true if and only
6b90: 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61   if an opcode wa
6ba0: 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  s removed..*/.in
6bb0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  t sqlite3VdbeDel
6bc0: 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56  etePriorOpcode(V
6bd0: 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a  dbe *p, u8 op){.
6be0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26    if( p->nOp>0 &
6bf0: 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  & p->aOp[p->nOp-
6c00: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b  1].opcode==op ){
6c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
6c20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6c30: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
6c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6c50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
6c60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6c70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
6c80: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
6c90: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
6ca0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
6cb0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
6cc0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
6cd0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
6ce0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
6cf0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
6d00: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
6d10: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
6d20: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
6d30: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
6d40: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
6d50: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
6d60: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
6d70: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
6d80: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
6d90: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
6da0: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
6db0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
6dc0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
6dd0: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
6de0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
6df0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
6e00: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
6e10: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
6e20: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
6e30: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
6e40: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
6e50: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
6e60: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
6e70: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
6e80: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
6e90: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
6ea0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
6eb0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
6ec0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
6ed0: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
6ee0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
6ef0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
6f00: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
6f10: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
6f20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
6f30: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
6f40: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6f50: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
6f60: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  nstruction..*/.s
6f70: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
6f80: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43  E_NOINLINE vdbeC
6f90: 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56  hangeP4Full(.  V
6fa0: 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f  dbe *p,.  Op *pO
6fb0: 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
6fc0: 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b  *zP4,.  int n.){
6fd0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79  .  if( pOp->p4ty
6fe0: 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34  pe ){.    freeP4
6ff0: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
7000: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
7010: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7020: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
7030: 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  4.p = 0;.  }.  i
7040: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( n<0 ){.    sq
7050: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7060: 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d  4(p, (int)(pOp -
7070: 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e   p->aOp), zP4, n
7080: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7090: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
70a0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
70b0: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
70c0: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
70d0: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
70e0: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
70f0: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
7100: 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  IC;.  }.}.void s
7110: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7120: 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P4(Vdbe *p, int 
7130: 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  addr, const char
7140: 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20   *zP4, int n){. 
7150: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69   Op *pOp;.  sqli
7160: 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
7170: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20  t( p!=0 );.  db 
7180: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
7190: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
71a0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
71b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
71c0: 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
71d0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
71e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
71f0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d  d ){.    if( n!=
7200: 50 34 5f 56 54 41 42 20 29 20 66 72 65 65 50 34  P4_VTAB ) freeP4
7210: 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a  (db, n, (void*)*
7220: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
7230: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7240: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
7250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
7260: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  ddr<p->nOp );.  
7270: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
7280: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
7290: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  - 1;.  }.  pOp =
72a0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
72b0: 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f    if( n>=0 || pO
72c0: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
72d0: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
72e0: 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e  l(p, pOp, zP4, n
72f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7300: 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49   }.  if( n==P4_I
7310: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
7320: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
7330: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
7340: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
7350: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
7360: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
7370: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
7380: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
7390: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
73a0: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
73b0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
73c0: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
73d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
73e0: 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  4!=0 ){.    asse
73f0: 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70  rt( n<0 );.    p
7400: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
7410: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
7420: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
7430: 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28   char)n;.    if(
7440: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71   n==P4_VTAB ) sq
7450: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
7460: 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d  Table*)zP4);.  }
7470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7480: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
7490: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
74a0: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
74b0: 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68  uction .** to th
74c0: 65 20 76 61 6c 75 65 20 64 65 66 69 6e 65 64 20  e value defined 
74d0: 62 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  by the arguments
74e0: 2e 20 20 54 68 69 73 20 69 73 20 61 20 68 69 67  .  This is a hig
74f0: 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72 73 69  h-speed.** versi
7500: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
7510: 65 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a  eChangeP4()..**.
7520: 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  ** The P4 operan
7530: 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20  d must not have 
7540: 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
7550: 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 20 74 68  defined.  And th
7560: 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73 74  e new.** P4 must
7570: 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54 33 32   not be P4_INT32
7580: 2e 20 20 55 73 65 20 73 71 6c 69 74 65 33 56 64  .  Use sqlite3Vd
7590: 62 65 43 68 61 6e 67 65 50 34 28 29 20 69 6e 20  beChangeP4() in 
75a0: 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68 6f  either of.** tho
75b0: 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69  se cases..*/.voi
75c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70  d sqlite3VdbeApp
75d0: 65 6e 64 50 34 28 56 64 62 65 20 2a 70 2c 20 76  endP4(Vdbe *p, v
75e0: 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e 29  oid *pP4, int n)
75f0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  {.  VdbeOp *pOp;
7600: 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 50 34  .  assert( n!=P4
7610: 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d 50 34 5f  _INT32 && n!=P4_
7620: 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74  VTAB );.  assert
7630: 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( n<=0 );.  if( 
7640: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7650: 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50  led ){.    freeP
7660: 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34 29  4(p->db, n, pP4)
7670: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7680: 73 73 65 72 74 28 20 70 50 34 21 3d 30 20 29 3b  ssert( pP4!=0 );
7690: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
76a0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70  nOp>0 );.    pOp
76b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
76c0: 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  p-1];.    assert
76d0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
76e0: 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20 20  4_NOTUSED );.   
76f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e   pOp->p4type = n
7700: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
7710: 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pP4;.  }.}../*
7720: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f  .** Set the P4 o
7730: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7740: 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65  tly added opcode
7750: 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   to the KeyInfo 
7760: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  for the.** index
7770: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
7780: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
7790: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
77a0: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
77b0: 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  dx){.  Vdbe *v =
77c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
77d0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
77e0: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 76  nfo;.  assert( v
77f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7800: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 70 4b   pIdx!=0 );.  pK
7810: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
7820: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
7830: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
7840: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 20 73  if( pKeyInfo ) s
7850: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
7860: 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  P4(v, pKeyInfo, 
7870: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a  P4_KEYINFO);.}..
7880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7890: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
78a0: 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  MENTS./*.** Chan
78b0: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
78c0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
78d0: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
78e0: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
78f0: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
7900: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
7910: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
7920: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
7930: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
7940: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
7950: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
7960: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
7970: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
7980: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
7990: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
79a0: 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56  d vdbeVComment(V
79b0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
79c0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
79d0: 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65  list ap){.  asse
79e0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
79f0: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
7a00: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
7a10: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
7a20: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
7a30: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
7a40: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
7a50: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61   p->nOp ){.    a
7a60: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b  ssert( p->aOp );
7a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7a80: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  ee(p->db, p->aOp
7a90: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
7aa0: 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  ent);.    p->aOp
7ab0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
7ac0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
7ad0: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
7ae0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d  rmat, ap);.  }.}
7af0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7b00: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
7b10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
7b20: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
7b30: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
7b40: 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61   p ){.    va_sta
7b50: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
7b60: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
7b70: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
7b80: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
7b90: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
7ba0: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
7bb0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
7bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
7bd0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
7be0: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
7bf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7c00: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
7c10: 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  op);.    va_star
7c20: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
7c30: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
7c40: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
7c50: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
7c60: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
7c70: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  /* NDEBUG */..#i
7c80: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
7c90: 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20  _COVERAGE./*.** 
7ca0: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66  Set the value if
7cb0: 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69   the iSrcLine fi
7cc0: 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  eld for the prev
7cd0: 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73  iously coded ins
7ce0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
7cf0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
7d00: 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20  LineNumber(Vdbe 
7d10: 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a  *v, int iLine){.
7d20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
7d30: 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69  Op(v,-1)->iSrcLi
7d40: 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65  ne = iLine;.}.#e
7d50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56  ndif /* SQLITE_V
7d60: 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a  DBE_COVERAGE */.
7d70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7d80: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
7d90: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49  iven address.  I
7da0: 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73  f the address is
7db0: 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74   -1, then.** ret
7dc0: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
7dd0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
7de0: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pcode..**.** If 
7df0: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
7e00: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
7e10: 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20  curred prior to 
7e20: 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74  the calling of t
7e30: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  his.** routine, 
7e40: 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
7e50: 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70  o a dummy VdbeOp
7e60: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
7e70: 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a  d.  That opcode.
7e80: 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62  ** is readable b
7e90: 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c  ut not writable,
7ea0: 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61   though it is ca
7eb0: 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65  st to a writable
7ec0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
7ed0: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
7ee0: 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74   opcode allows t
7ef0: 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69  he call to conti
7f00: 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a  nue functioning.
7f10: 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20  ** after an OOM 
7f20: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
7f30: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
7f40: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
7f50: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
7f60: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
7f70: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
7f80: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
7f90: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
7fa0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
7fb0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
7fc0: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
7fd0: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
7fe0: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
7ff0: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
8000: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62  Valgrind..*/.Vdb
8010: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
8020: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
8030: 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43  nt addr){.  /* C
8040: 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  89 specifies tha
8050: 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  t the constant "
8060: 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69  dummy" will be i
8070: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
8080: 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68  l.  ** zeros, wh
8090: 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20  ich is correct. 
80a0: 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20   MSVC generates 
80b0: 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72  a warning, never
80c0: 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74  theless. */.  st
80d0: 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d  atic VdbeOp dumm
80e0: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
80f0: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
8100: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
8110: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
8120: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
8130: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
8140: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
8150: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
8160: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
8170: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
8180: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
8190: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
81a0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
81b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
81c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
81d0: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
81e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
81f0: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
8200: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
8210: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8220: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8230: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NTS)./*.** Retur
8240: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
8250: 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ue for one of th
8260: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
8270: 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a  the opcode pOp.*
8280: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
8290: 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a  character c..*/.
82a0: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
82b0: 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f  lateP(char c, co
82c0: 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  nst Op *pOp){.  
82d0: 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74  if( c=='1' ) ret
82e0: 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  urn pOp->p1;.  i
82f0: 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75  f( c=='2' ) retu
8300: 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66  rn pOp->p2;.  if
8310: 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72  ( c=='3' ) retur
8320: 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  n pOp->p3;.  if(
8330: 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e   c=='4' ) return
8340: 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
8350: 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a  turn pOp->p5;.}.
8360: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8370: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
8380: 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20  "comment" field 
8390: 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  of a VDBE opcode
83a0: 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   listing..**.** 
83b0: 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69  The Synopsis: fi
83c0: 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20  eld in comments 
83d0: 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  in the vdbe.c so
83e0: 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63  urce file gets c
83f0: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61  onverted.** to a
8400: 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74  n extra string t
8410: 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20  hat is appended 
8420: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70  to the sqlite3Op
8430: 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20  codeName().  In 
8440: 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f  the.** absence o
8450: 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73  f other comments
8460: 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20  , this synopsis 
8470: 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d  becomes the comm
8480: 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64  ent on the opcod
8490: 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73  e..** Some trans
84a0: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a  lation occurs:.*
84b0: 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20  *.**       "PX" 
84c0: 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a       ->  "r[X]".
84d0: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22  **       "PX@PY"
84e0: 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59     ->  "r[X..X+Y
84f0: 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20  -1]"  or "r[x]" 
8500: 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a  if y is 0 or 1.*
8510: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31  *       "PX@PY+1
8520: 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d  " ->  "r[X..X+Y]
8530: 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  "    or "r[x]" i
8540: 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20  f y is 0.**     
8550: 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20    "PY..PY"  ->  
8560: 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f  "r[X..Y]"      o
8570: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78  r "r[x]" if y<=x
8580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
8590: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20  isplayComment(. 
85a0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20   const Op *pOp, 
85b0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
85c0: 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65  e to be commente
85d0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
85e0: 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65  r *zP4,   /* Pre
85f0: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
8600: 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f   value for P4 */
8610: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  .  char *zTemp, 
8620: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
8630: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20  esult here */.  
8640: 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20  int nTemp       
8650: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
8660: 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d  lable in zTemp[]
8670: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
8680: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
8690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e  const char *zSyn
86a0: 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70  opsis;.  int nOp
86b0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20  Name;.  int ii, 
86c0: 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b  jj;.  char zAlt[
86d0: 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d  50];.  zOpName =
86e0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
86f0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
8700: 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  nOpName = sql
8710: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
8720: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70  Name);.  if( zOp
8730: 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20  Name[nOpName+1] 
8740: 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43  ){.    int seenC
8750: 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  om = 0;.    char
8760: 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69   c;.    zSynopsi
8770: 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e  s = zOpName += n
8780: 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20  OpName + 1;.    
8790: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
87a0: 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d  opsis,"IF ",3)==
87b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
87c0: 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
87d0: 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20  STOREP2 ){.     
87e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
87f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29  ntf(sizeof(zAlt)
8800: 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d  , zAlt, "r[P2] =
8810: 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69   (%s)", zSynopsi
8820: 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+3);.      }els
8830: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8840: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
8850: 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20  of(zAlt), zAlt, 
8860: 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c  "if %s goto P2",
8870: 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20   zSynopsis+3);. 
8880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79       }.      zSy
8890: 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20  nopsis = zAlt;. 
88a0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
88b0: 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31  jj=0; jj<nTemp-1
88c0: 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73   && (c = zSynops
88d0: 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b  is[ii])!=0; ii++
88e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  ){.      if( c==
88f0: 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'P' ){.        c
8900: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69   = zSynopsis[++i
8910: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
8920: 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20  c=='4' ){.      
8930: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8940: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8950: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a  Temp+jj, "%s", z
8960: 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  P4);.        }el
8970: 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b  se if( c=='X' ){
8980: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8990: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
89a0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
89b0: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
89c0: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
89d0: 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20  seenCom = 1;.   
89e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
89f0: 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74        int v1 = t
8a00: 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70  ranslateP(c, pOp
8a10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
8a20: 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73   v2;.          s
8a30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8a40: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8a50: 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20  jj, "%d", v1);. 
8a60: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
8a70: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
8a80: 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30  i+1, "@P", 2)==0
8a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8aa0: 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20  ii += 3;.       
8ab0: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
8ac0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
8ad0: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +jj);.          
8ae0: 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65    v2 = translate
8af0: 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c  P(zSynopsis[ii],
8b00: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
8b10: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
8b20: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b  Synopsis+ii+1,"+
8b30: 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  1",2)==0 ){.    
8b40: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
8b50: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
8b60: 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   v2++;.         
8b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8b80: 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20   if( v2>1 ){.   
8b90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
8ba0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8bb0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8bc0: 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29  "..%d", v1+v2-1)
8bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
8be0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
8bf0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
8c00: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50  opsis+ii+1, "..P
8c10: 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70  3", 4)==0 && pOp
8c20: 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p3==0 ){.     
8c30: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a         ii += 4;.
8c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a      }.        jj
8c60: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8c70: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
8c80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c90: 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20      zTemp[jj++] 
8ca0: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
8cb0: 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
8cc0: 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d  Com && jj<nTemp-
8cd0: 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  5 && pOp->zComme
8ce0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
8cf0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8d00: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
8d10: 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43   "; %s", pOp->zC
8d20: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a  omment);.      j
8d30: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
8d40: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
8d50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a      }.    if( jj
8d60: 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a  <nTemp ) zTemp[j
8d70: 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  j] = 0;.  }else 
8d80: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
8d90: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8da0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8db0: 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f   zTemp, "%s", pO
8dc0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
8dd0: 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74    jj = sqlite3St
8de0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8df0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d   }else{.    zTem
8e00: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a  p[0] = 0;.    jj
8e10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8e20: 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn jj;.}.#endif 
8e30: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
8e40: 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  */..#if VDBE_DIS
8e50: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
8e60: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8e70: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f  _CURSOR_HINTS)./
8e80: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74  *.** Translate t
8e90: 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75  he P4.pExpr valu
8ea0: 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73  e for an OP_Curs
8eb0: 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e  orHint opcode in
8ec0: 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20  to text.** that 
8ed0: 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64  can be displayed
8ee0: 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d   in the P4 colum
8ef0: 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74  n of EXPLAIN out
8f00: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
8f10: 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70  oid displayP4Exp
8f20: 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45  r(StrAccum *p, E
8f30: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
8f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
8f50: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
8f60: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
8f70: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
8f80: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8f90: 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78  ntf(p, "%Q", pEx
8fa0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
8fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8fc0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
8fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8fe0: 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20 70  rintf(p, "%d", p
8ff0: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
9000: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9010: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
9020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9030: 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b  intf(p, "NULL");
9040: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9050: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
9060: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
9070: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72  te3XPrintf(p, "r
9080: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
9090: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
90a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
90b0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
90c0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
90d0: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
90e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
90f0: 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22 29  intf(p, "rowid")
9100: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9120: 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c 20  rintf(p, "c%d", 
9130: 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c  (int)pExpr->iCol
9140: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
9150: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
9170: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22        zOp = "LT"
9180: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9190: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
91a0: 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20     zOp = "LE";  
91b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
91c0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
91d0: 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  zOp = "GT";     
91e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
91f0: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70   TK_GE:      zOp
9200: 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 72   = "GE";      br
9210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9220: 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _NE:      zOp = 
9230: 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "NE";      break
9240: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
9250: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51  :      zOp = "EQ
9260: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9270: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20     case TK_IS:  
9280: 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20      zOp = "IS"; 
9290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92a0: 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
92b0: 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20   zOp = "ISNOT"; 
92c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
92d0: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f  e TK_AND:     zO
92e0: 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62  p = "AND";     b
92f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9300: 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_OR:      zOp =
9310: 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61   "OR";      brea
9320: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
9330: 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41  LUS:    zOp = "A
9340: 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  DD";     break;.
9350: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
9360: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22  :    zOp = "MUL"
9370: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9380: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
9390: 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20    zOp = "SUB";  
93a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
93b0: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
93c0: 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20  Op = "REM";     
93d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
93e0: 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20  TK_BITAND:  zOp 
93f0: 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65  = "BITAND";  bre
9400: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9410: 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22  BITOR:   zOp = "
9420: 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b  BITOR";   break;
9430: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
9440: 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56  SH:   zOp = "DIV
9450: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9460: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
9470: 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54  :  zOp = "LSHIFT
9480: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
9490: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
94a0: 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  zOp = "RSHIFT"; 
94b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
94c0: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70   TK_CONCAT:  zOp
94d0: 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72   = "CONCAT";  br
94e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
94f0: 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20  _UMINUS:  zOp = 
9500: 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b  "MINUS";   break
9510: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  ;.    case TK_UP
9520: 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c  LUS:   zOp = "PL
9530: 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  US";    break;. 
9540: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
9550: 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f  T:  zOp = "BITNO
9560: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
9570: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
9580: 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20   zOp = "NOT";   
9590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
95a0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f  e TK_ISNULL:  zO
95b0: 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62  p = "ISNULL";  b
95c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
95d0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d  K_NOTNULL: zOp =
95e0: 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61   "NOTNULL"; brea
95f0: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
9600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9610: 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 22  rintf(p, "%s", "
9620: 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72  expr");.      br
9630: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
9640: 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  zOp ){.    sqlit
9650: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
9660: 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69  (", zOp);.    di
9670: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
9680: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9690: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
96a0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
96b0: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
96c0: 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  nd(p, ",", 1);. 
96d0: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
96e0: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
96f0: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
9700: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
9710: 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29  ppend(p, ")", 1)
9720: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
9730: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
9740: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
9750: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
9760: 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69  R_HINTS) */...#i
9770: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
9780: 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  4./*.** Compute 
9790: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
97a0: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
97b0: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
97c0: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
97d0: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
97e0: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
97f0: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
9800: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
9810: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
9820: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
9830: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
9840: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
9850: 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61   StrAccum x;.  a
9860: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
9870: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72   );.  sqlite3Str
9880: 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c  AccumInit(&x, 0,
9890: 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30   zTemp, nTemp, 0
98a0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
98b0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
98c0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
98d0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a   {.      int j;.
98e0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
98f0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
9900: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
9910: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
9920: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
9930: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
9940: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 6b  e3XPrintf(&x, "k
9950: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
9960: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66  nField);.      f
9970: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
9980: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
9990: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
99a0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
99b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
99c0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
99d0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
99e0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
99f0: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  : "";.        if
9a00: 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20  ( strcmp(zColl, 
9a10: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a  "BINARY")==0 ) z
9a20: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
9a30: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9a40: 74 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20  tf(&x, ",%s%s", 
9a50: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
9a60: 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20  rder[j] ? "-" : 
9a70: 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  "", zColl);.    
9a80: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9a90: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
9aa0: 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20  &x, ")", 1);.   
9ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9ac0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9ad0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
9ae0: 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58  S.    case P4_EX
9af0: 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70  PR: {.      disp
9b00: 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f  layP4Expr(&x, pO
9b10: 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20  p->p4.pExpr);.  
9b20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9b30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
9b40: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
9b50: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9b60: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
9b70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
9b80: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28  e3XPrintf(&x, "(
9b90: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
9ba0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
9bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9bc0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
9bd0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
9be0: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
9bf0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
9c00: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9c10: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
9c20: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
9c30: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
9c40: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
9c50: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
9c60: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
9c70: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 63 61  _PROFILE).    ca
9c80: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b  se P4_FUNCCTX: {
9c90: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
9ca0: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
9cb0: 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Ctx->pFunc;.    
9cc0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9cd0: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70  (&x, "%s(%d)", p
9ce0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
9cf0: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
9d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9d10: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
9d20: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
9d30: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9d40: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
9d50: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
9d60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9d70: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
9d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9d90: 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c 20  rintf(&x, "%d", 
9da0: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20  pOp->p4.i);.    
9db0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9dc0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
9dd0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9de0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31  XPrintf(&x, "%.1
9df0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
9e00: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
9e10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9e20: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
9e30: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
9e40: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
9e50: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
9e60: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
9e70: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
9e80: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
9e90: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
9ea0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
9eb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9ec0: 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22  rintf(&x, "%lld"
9ed0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
9ee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
9ef0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9f00: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
9f10: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9f20: 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  x, "%.16g", pMem
9f30: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
9f40: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
9f50: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
9f60: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
9f70: 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65  "NULL";.      }e
9f80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
9f90: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
9fa0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
9fb0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
9fc0: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
9fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fe0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
9ff0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a000: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
a010: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
a020: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
a030: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
a040: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
a050: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
a060: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
a070: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
a080: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a090: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
a0a0: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
a0b0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
a0c0: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
a0d0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
a0e0: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
a0f0: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
a100: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
a110: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
a140: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
a150: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
a160: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
a170: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
a180: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
a190: 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69  (&x, ",%d", ai[i
a1a0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
a1b0: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27    zTemp[0] = '['
a1c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
a1d0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78  trAccumAppend(&x
a1e0: 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20  , "]", 1);.     
a1f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a200: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
a210: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
a220: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
a230: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
a240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a250: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
a260: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
a270: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
a280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a290: 20 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45 3a    case P4_TABLE:
a2a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a2b0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 22  XPrintf(&x, "%s"
a2c0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e  , pOp->p4.pTab->
a2d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
a2e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
a2f0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
a300: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
a310: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
a320: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
a330: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
a340: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
a350: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a360: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
a370: 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20  cumFinish(&x);. 
a380: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
a390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
a3a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
a3b0: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a  E_DISPLAY_P4 */.
a3c0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
a3d0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
a3e0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
a3f0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
a400: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
a410: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
a420: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
a430: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
a440: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
a450: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
a460: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
a470: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
a480: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
a490: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
a4a0: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
a4b0: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
a4c0: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
a4d0: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
a4e0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
a4f0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
a500: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
a510: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
a520: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
a530: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
a540: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
a550: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
a560: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
a570: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
a580: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
a590: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
a5a0: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44  eeMask)*8 );.  D
a5b0: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65  bMaskSet(p->btre
a5c0: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28  eMask, i);.  if(
a5d0: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
a5e0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
a5f0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
a600: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
a610: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69  t(p->lockMask, i
a620: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  );.  }.}..#if !d
a630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a640: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
a650: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
a660: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
a670: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
a680: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
a690: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
a6a0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
a6b0: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
a6c0: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
a6d0: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
a6e0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
a6f0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
a700: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
a710: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
a720: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
a730: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
a740: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
a750: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
a760: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
a770: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
a780: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
a790: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
a7a0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
a7b0: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
a7c0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
a7d0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
a7e0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
a7f0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
a800: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
a810: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
a820: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
a830: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
a840: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
a850: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
a860: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
a870: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
a880: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
a890: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
a8a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
a8b0: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
a8c0: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
a8d0: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
a8e0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
a8f0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
a900: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
a910: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a920: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
a930: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
a940: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
a950: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
a960: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
a970: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
a980: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
a990: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
a9a0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
a9b0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
a9c0: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
a9d0: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
a9e0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
a9f0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
aa00: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
aa10: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
aa20: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
aa30: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
aa40: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
aa50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
aa60: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
aa70: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
aa80: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
aa90: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
aaa0: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
aab0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
aac0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
aad0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
aae0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
aaf0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
ab00: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
ab10: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
ab20: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
ab30: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
ab40: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
ab50: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
ab60: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
ab70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
ab80: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
ab90: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
aba0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
abb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
abc0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
abd0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
abe0: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
abf0: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
ac00: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
ac10: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
ac20: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
ac30: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74  beEnter()..*/.st
ac40: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
ac50: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65  LINE void vdbeLe
ac60: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
ac70: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
ac80: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
ac90: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62  .  int nDb;.  db
aca0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
acb0: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
acc0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
acd0: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
ace0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
acf0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
ad00: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
ad10: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
ad20: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
ad30: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
ad40: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
ad50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
ad60: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
ad70: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
ad80: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
ad90: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
ada0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
adb0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76  mmon case */.  v
adc0: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23  dbeLeave(p);.}.#
add0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
ade0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
adf0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
ae00: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
ae10: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
ae20: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
ae30: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
ae40: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
ae50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ae60: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
ae70: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
ae80: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
ae90: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
aea0: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
aeb0: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
aec0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
aed0: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
aee0: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
aef0: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
af00: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
af10: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
af20: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
af30: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
af40: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
af50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
af60: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
af70: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
af80: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
af90: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
afa0: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
afb0: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
afc0: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
afd0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
afe0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
aff0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
b000: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
b010: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
b020: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
b030: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
b040: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
b050: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
b060: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
b070: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
b080: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
b090: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
b0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
b0b0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
b0c0: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
b0d0: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
b0e0: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
b0f0: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
b100: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
b110: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
b120: 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61  itialize an arra
b130: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
b140: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
b150: 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28  id initMemArray(
b160: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73  Mem *p, int N, s
b170: 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20  qlite3 *db, u16 
b180: 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28  flags){.  while(
b190: 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20   (N--)>0 ){.    
b1a0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
b1b0: 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  p->flags = flags
b1c0: 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  ;.    p->szMallo
b1d0: 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
b1e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
b1f0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30  ->pScopyFrom = 0
b200: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b  ;.#endif.    p++
b210: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
b220: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
b230: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
b240: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
b250: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b260: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
b270: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
b280: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d  .    Mem *pEnd =
b290: 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69   &p[N];.    sqli
b2a0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
b2b0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
b2c0: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
b2d0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
b2e0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
b2f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b300: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
b310: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
b320: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
b330: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
b340: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
b350: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
b360: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
b370: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
b380: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b390: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
b3a0: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
b3b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
b3c0: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
b3d0: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
b3e0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
b3f0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
b400: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
b410: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
b420: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
b430: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
b440: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
b450: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
b460: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
b470: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
b480: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
b490: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
b4a0: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
b4b0: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
b4c0: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
b4d0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
b4e0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
b4f0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
b500: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
b510: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
b520: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
b530: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
b540: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
b550: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
b560: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
b570: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
b580: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
b590: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
b5a0: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
b5b0: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
b5c0: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
b5d0: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
b5e0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
b5f0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
b600: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
b610: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
b620: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
b630: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
b640: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
b650: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
b660: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
b670: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
b680: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
b690: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
b6a0: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
b6b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
b6c0: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
b6d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b6e0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
b6f0: 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  _Frame );.      
b700: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
b710: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
b720: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
b730: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
b740: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
b750: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
b760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b770: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
b780: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b790: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b  ( p->szMalloc ){
b7a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b7b0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e  DbFreeNN(db, p->
b7c0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
b7d0: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20    p->szMalloc = 
b7e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
b7f0: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
b800: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20  _Undefined;.    
b810: 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45  }while( (++p)<pE
b820: 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nd );.  }.}../*.
b830: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
b840: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
b850: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
b860: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
b870: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
b880: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
b890: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
b8a0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
b8b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b8c0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
b8d0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
b8e0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
b8f0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
b900: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
b910: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
b920: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
b930: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
b940: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b950: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
b960: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b970: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
b980: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
b990: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
b9a0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
b9b0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
b9c0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
b9d0: 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70  ata(p->v->db, &p
b9e0: 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
b9f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
ba00: 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29  ree(p->v->db, p)
ba10: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
ba20: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
ba30: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
ba40: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
ba50: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
ba60: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
ba70: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
ba80: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
ba90: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
baa0: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
bab0: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
bac0: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
bad0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
bae0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
baf0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
bb00: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
bb10: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
bb20: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
bb30: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
bb40: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
bb50: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
bb60: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
bb70: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
bb80: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
bb90: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
bba0: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
bbb0: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
bbc0: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
bbd0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
bbe0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
bbf0: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
bc00: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20  ERY PLAN..**.** 
bc10: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
bc20: 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61  =1, first the ma
bc30: 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69  in program is li
bc40: 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20  sted, then each 
bc50: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  of.** the trigge
bc60: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
bc70: 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20  e listed one by 
bc80: 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  one..*/.int sqli
bc90: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
bca0: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
bcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bcc0: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
bcd0: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72    /* Stop when r
bd00: 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ow count reaches
bd10: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e   this */.  int n
bd20: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
bd50: 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66  -vdbes seen so f
bd60: 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72  ar */.  SubProgr
bd70: 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20  am **apSub = 0; 
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd90: 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62  Array of sub-vdb
bda0: 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75  es */.  Mem *pSu
bdb0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bdd0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64  Memory cell hold
bde0: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
bdf0: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
be00: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be20: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
be30: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
be40: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
be70: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
be80: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
be90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
bea0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
beb0: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
bec0: 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20  aMem[1];        
bed0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
bee0: 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20  m of result set 
bef0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
bf00: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
bf10: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
bf20: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
bf30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
bf40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
bf50: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
bf60: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
bf70: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
bf80: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
bf90: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
bfa0: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
bfb0: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
bfc0: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
bfd0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
bfe0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
bff0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
c000: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
c010: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
c020: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
c030: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
c040: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
c050: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c060: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
c070: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
c080: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c090: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29  ITE_NOMEM_BKPT )
c0a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
c0b0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
c0c0: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
c0d0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
c0e0: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
c0f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
c100: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
c110: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  led.  */.    sql
c120: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
c130: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
c140: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
c150: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
c160: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
c170: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77  ows reaches nRow
c180: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
c190: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61  .  ** listing ha
c1a0: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73  s finished and s
c1b0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68  qlite3_step() sh
c1c0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
c1d0: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52  TE_DONE..  ** nR
c1e0: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ow is the sum of
c1f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c200: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
c210: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20  program, plus.  
c220: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ** the sum of th
c230: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
c240: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20   in all trigger 
c250: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f  subprograms enco
c260: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20  untered.  ** so 
c270: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  far.  The nRow v
c280: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  alue will increa
c290: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65  se as new trigge
c2a0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
c2b0: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  e.  ** encounter
c2c0: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69  ed, but p->pc wi
c2d0: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
c2e0: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a  tch up to nRow..
c2f0: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d    */.  nRow = p-
c300: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65  >nOp;.  if( p->e
c310: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
c320: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20   /* The first 8 
c330: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65  memory cells are
c340: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65   used for the re
c350: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65  sult set.  So we
c360: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d   will.    ** com
c370: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20  mandeer the 9th 
c380: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73  cell to use as s
c390: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72  torage for an ar
c3a0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a  ray of pointers.
c3b0: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65      ** to trigge
c3c0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  r subprograms.  
c3d0: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72  The VDBE is guar
c3e0: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
c3f0: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a  t least 9.    **
c400: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20   cells.  */.    
c410: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e  assert( p->nMem>
c420: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20  9 );.    pSub = 
c430: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20  &p->aMem[9];.   
c440: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73   if( pSub->flags
c450: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
c460: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72     /* On the fir
c470: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
c480: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20  e3_step(), pSub 
c490: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c  will hold a NULL
c4a0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a  .  It is.      *
c4b0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
c4c0: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50   a BLOB by the P
c4d0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f  4_SUBPROGRAM pro
c4e0: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65  cessing logic be
c4f0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75  low */.      nSu
c500: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65  b = pSub->n/size
c510: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20  of(Vdbe*);.     
c520: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
c530: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
c540: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
c550: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29  =0; i<nSub; i++)
c560: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20  {.      nRow += 
c570: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[i]->nOp;. 
c580: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
c590: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
c5a0: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f  .  }while( i<nRo
c5b0: 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  w && p->explain=
c5c0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
c5d0: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
c5e0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e  in );.  if( i>=n
c5f0: 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  Row ){.    p->rc
c600: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c610: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
c620: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
c630: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
c640: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
c650: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
c660: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
c670: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
c680: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
c690: 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  r(p, sqlite3ErrS
c6a0: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
c6b0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
c6c0: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  P4;.    Op *pOp;
c6d0: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
c6e0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
c6f0: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
c700: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
c710: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
c720: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
c730: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
c740: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
c750: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
c760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c770: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
c780: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
c790: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
c7a0: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
c7b0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
c7c0: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
c7d0: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
c7e0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
c7f0: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
c800: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
c810: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
c820: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
c830: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
c840: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
c850: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
c860: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
c870: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
c880: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
c890: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c8a0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
c8b0: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
c8e0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
c8f0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
c900: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c910: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
c920: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
c930: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
c940: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
c950: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
c960: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
c970: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
c980: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
c990: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
c9a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c9b0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
c9c0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
c9d0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
c9e0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
c9f0: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
ca00: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
ca10: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
ca20: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
ca30: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
ca40: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
ca50: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
ca60: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
ca70: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
ca80: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
ca90: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
caa0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
cab0: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
cac0: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
cad0: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
cae0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
caf0: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
cb00: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
cb10: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
cb20: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
cb30: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
cb40: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
cb50: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
cb60: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
cb70: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
cb80: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
cb90: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
cba0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
cbb0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
cbc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
cbd0: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
cbe0: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
cbf0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
cc00: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
cc10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
cc20: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
cc30: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
cc40: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
cc50: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
cc60: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
cc70: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
cc80: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
cc90: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
cca0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
ccb0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
ccc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ccd0: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
cce0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ccf0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
cd00: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
cd30: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
cd40: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
cd50: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
cd60: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
cd90: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
cda0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
cdb0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
cdc0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cde0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
cdf0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
ce00: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
ce10: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
ce20: 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20  e(pMem, 100) ){ 
ce30: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
ce40: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
ce50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ce60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce70: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
ce80: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ce90: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
cea0: 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73  m;.    zP4 = dis
ceb0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
cec0: 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  ->z, pMem->szMal
ced0: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  loc);.    if( zP
cee0: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
cef0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b      pMem->n = 0;
cf00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cf10: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
cf20: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
cf30: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
cf40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
cf50: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
cf60: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
cf70: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
cf80: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
cf90: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
cfa0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
cfb0: 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  }.    pMem++;.. 
cfc0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
cfd0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
cfe0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
cff0: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
d000: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
d010: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
d020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d030: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
d040: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
d060: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
d070: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
d080: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
d090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
d0a0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
d0b0: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
d0c0: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
d0d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
d0e0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
d0f0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
d100: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d110: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
d120: 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  MENTS.      if( 
d130: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
d140: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
d150: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
d160: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
d170: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d180: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
d190: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
d1b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
d1c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
d1d0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
d1e0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
d1f0: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
d200: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
d210: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
d220: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
d230: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
d240: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d260: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64   Comment */.#end
d270: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
d280: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
d290: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
d2a0: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  1);.    p->pResu
d2b0: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
d2c0: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  [1];.    p->rc =
d2d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d2e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
d2f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d300: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d310: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
d320: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
d330: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
d340: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
d350: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
d360: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
d370: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
d380: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
d390: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
d3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
d3b0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  0;.  if( p->zSql
d3c0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a   ){.    z = p->z
d3d0: 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Sql;.  }else if(
d3e0: 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20   p->nOp>=1 ){.  
d3f0: 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a    const VdbeOp *
d400: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
d410: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
d420: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
d430: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
d440: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
d450: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
d460: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
d470: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
d480: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
d490: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
d4a0: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
d4b0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
d4c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
d4d0: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
d4e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
d4f0: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
d500: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
d510: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
d520: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
d530: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
d540: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
d550: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
d560: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
d570: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
d580: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
d590: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
d5a0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
d5b0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
d5c0: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
d5d0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
d5e0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
d5f0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
d600: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
d610: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
d620: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
d630: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
d640: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
d650: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
d660: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
d670: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
d680: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
d690: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
d6a0: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
d6b0: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
d6c0: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
d6d0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
d6e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d6f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
d700: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
d710: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
d720: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
d730: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
d740: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
d750: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
d760: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
d770: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
d780: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e  OTRACE */../* An
d790: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
d7a0: 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62  s object describ
d7b0: 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61  es bulk memory a
d7c0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
d7d0: 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e  .** by subcompon
d7e0: 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72  ents of a prepar
d7f0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  ed statement.  S
d800: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
d810: 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65  d out.** of a Re
d820: 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65  usableSpace obje
d830: 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53  ct by the allocS
d840: 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62  pace() routine b
d850: 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elow..*/.struct 
d860: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a  ReusableSpace {.
d870: 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20    u8 *pSpace;   
d880: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
d890: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
d8a0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
d8b0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
d8c0: 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   available memor
d8d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64  y */.  int nNeed
d8e0: 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ed;         /* T
d8f0: 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20  otal bytes that 
d900: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c  could not be all
d910: 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ocated */.};../*
d920: 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65   Try to allocate
d930: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
d940: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62  8-byte aligned b
d950: 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70  ulk memory for p
d960: 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  Buf.** from the 
d970: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62  ReusableSpace ob
d980: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
d990: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
d9a0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f  llocated.** memo
d9b0: 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ry on success.  
d9c0: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
d9d0: 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
d9e0: 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65  ble in the.** Re
d9f0: 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65  usableSpace obje
da00: 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ct, increase the
da10: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e   ReusableSpace.n
da20: 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20  Needed.** value 
da30: 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65  by the amount ne
da40: 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20  eded and return 
da50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  NULL..**.** If p
da60: 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69  Buf is not initi
da70: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20  ally NULL, that 
da80: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d  means that the m
da90: 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64  emory has alread
daa0: 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61  y.** been alloca
dab0: 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63  ted by a prior c
dac0: 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
dad0: 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ine, so just ret
dae0: 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  urn a copy.** of
daf0: 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20   pBuf and leave 
db00: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e  ReusableSpace un
db10: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  changed..**.** T
db20: 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73  his allocator is
db30: 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70   employed to rep
db40: 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c  urpose unused sl
db50: 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ots at the end o
db60: 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20  f the.** opcode 
db70: 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65  array of prepare
db80: 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65  d state for othe
db90: 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f  r memory needs o
dba0: 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a  f the prepared.*
dbb0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  * statement..*/.
dbc0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
dbd0: 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63  ocSpace(.  struc
dbe0: 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  t ReusableSpace 
dbf0: 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d  *p,  /* Bulk mem
dc00: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
dc10: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
dc20: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dc40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f  ointer to a prio
dc50: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
dc60: 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dc80: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e  ytes of memory n
dc90: 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  eeded */.){.  as
dca0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
dcb0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53  _ALIGNMENT(p->pS
dcc0: 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70  pace) );.  if( p
dcd0: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42  Buf==0 ){.    nB
dce0: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
dcf0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
dd00: 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29  te <= p->nFree )
dd10: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65  {.      p->nFree
dd20: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20   -= nByte;.     
dd30: 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61   pBuf = &p->pSpa
dd40: 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20  ce[p->nFree];.  
dd50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
dd60: 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79  ->nNeeded += nBy
dd70: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  te;.    }.  }.  
dd80: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
dd90: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75  TE_ALIGNMENT(pBu
dda0: 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  f) );.  return p
ddb0: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
ddc0: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
ddd0: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
dde0: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
ddf0: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
de00: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
de10: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
de20: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
de30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
de40: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
de50: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
de60: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
de70: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
de80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
de90: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
dea0: 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  IT || p->magic==
deb0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54  VDBE_MAGIC_RESET
dec0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
ded0: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
dee0: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
def0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
df00: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
df10: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
df20: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
df30: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
df40: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
df50: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
df60: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65  AGIC_RUN;..#ifde
df70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
df80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
df90: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Mem; i++){.    a
dfa0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
dfb0: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ].db==p->db );. 
dfc0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
dfd0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
dfe0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
dff0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
e000: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e  OE_Abort;.  p->n
e010: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
e020: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
e030: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
e040: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
e050: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
e060: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
e070: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
e080: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
e090: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
e0a0: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
e0b0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
e0c0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
e0d0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
e0e0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
e0f0: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
e100: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
e110: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
e120: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
e130: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
e140: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
e150: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
e160: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
e170: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
e180: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
e190: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
e1a0: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
e1b0: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
e1c0: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
e1d0: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
e1e0: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
e1f0: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
e200: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
e210: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
e220: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
e230: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
e240: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
e250: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
e260: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
e270: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
e280: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
e290: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
e2a0: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
e2b0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
e2c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
e2d0: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
e2e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e2f0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
e300: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
e310: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
e320: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
e330: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
e340: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
e350: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
e360: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
e370: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
e380: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
e390: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
e3a0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
e3b0: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
e3c0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
e3d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
e3e0: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
e3f0: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
e400: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
e410: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
e420: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
e430: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
e440: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
e450: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
e460: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e480: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
e490: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e4c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e4d0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
e4e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
e4f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e500: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
e510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e520: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e530: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
e540: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e570: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
e580: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
e590: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
e5a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e5b0: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
e5c0: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
e5d0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
e5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e5f0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
e600: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
e610: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e640: 74 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ter */.  struct 
e650: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b  ReusableSpace x;
e660: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61          /* Reusa
e670: 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  ble bulk memory 
e680: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
e690: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e6a0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
e6b0: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
e6c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e6d0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
e6e0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
e6f0: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70  rt( pParse==p->p
e700: 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20  Parse );.  db = 
e710: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
e720: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e730: 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d  d==0 );.  nVar =
e740: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20   pParse->nVar;. 
e750: 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   nMem = pParse->
e760: 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20  nMem;.  nCursor 
e770: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
e780: 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d    nArg = pParse-
e790: 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f  >nMaxArg;.  .  /
e7a0: 2a 20 45 61 63 68 20 63 75 72 73 6f 72 20 75 73  * Each cursor us
e7b0: 65 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  es a memory cell
e7c0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 63 75 72  .  The first cur
e7d0: 73 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20 63  sor (cursor 0) c
e7e0: 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d  an.  ** use aMem
e7f0: 5b 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74  [0] which is not
e800: 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 64 20   otherwise used 
e810: 62 79 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  by the VDBE prog
e820: 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20  ram.  Allocate. 
e830: 20 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68 65   ** space at the
e840: 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66   end of aMem[] f
e850: 6f 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64  or cursors 1 and
e860: 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53   greater..  ** S
e870: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
e880: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
e890: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
e8a0: 72 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72  r;.  if( nCursor
e8b0: 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20  ==0 && nMem>0 ) 
e8c0: 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63  nMem++;  /* Spac
e8d0: 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76  e for aMem[0] ev
e8e0: 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a  en if not used *
e8f0: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
e900: 75 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73  ut how much reus
e910: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61  able memory is a
e920: 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20  vailable at the 
e930: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  end of the.  ** 
e940: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54  opcode array.  T
e950: 68 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79  his extra memory
e960: 20 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63   will be realloc
e970: 61 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65  ated for other e
e980: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  lements.  ** of 
e990: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
e9a0: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  tement..  */.  n
e9b0: 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
e9c0: 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20  (Op)*p->nOp);   
e9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e9e0: 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65  tes of opcode me
e9f0: 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78  mory used */.  x
ea00: 2e 70 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a  .pSpace = &((u8*
ea10: 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20  )p->aOp)[n];    
ea20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
ea30: 75 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f  used opcode memo
ea40: 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ry */.  assert( 
ea50: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
ea60: 4d 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29  MENT(x.pSpace) )
ea70: 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f  ;.  x.nFree = RO
ea80: 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d  UNDDOWN8(pParse-
ea90: 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b  >szOpAlloc - n);
eaa0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e    /* Bytes of un
eab0: 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  used memory */. 
eac0: 20 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65   assert( x.nFree
ead0: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
eae0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
eaf0: 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b  NMENT(&x.pSpace[
eb00: 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20  x.nFree]) );..  
eb10: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
eb20: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e  p, &nArg);.  p->
eb30: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
eb40: 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69  = (u8)(pParse->i
eb50: 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70  sMultiWrite && p
eb60: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
eb70: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
eb80: 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  explain && nMem<
eb90: 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d  10 ){.    nMem =
eba0: 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78   10;.  }.  p->ex
ebb0: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pired = 0;..  /*
ebc0: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
ebd0: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
ebe0: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
ebf0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
ec00: 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20  one or two.  ** 
ec10: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
ec20: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
ec30: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
ec40: 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65  ed memory at the
ec50: 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68   .  ** end of th
ec60: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
ec70: 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
ec80: 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c  e to satisfy all
ec90: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
eca0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75  uirements by reu
ecb0: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20  sing the opcode 
ecc0: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e  array tail, then
ecd0: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a   the second.  **
ece0: 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20   pass will fill 
ecf0: 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
ed00: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d   using a fresh m
ed10: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
ed20: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
ed30: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
ed40: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
ed50: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
ed60: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
ed70: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
ed80: 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65  er memory at the
ed90: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
eda0: 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  de array.  This 
edb0: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
edc0: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
edd0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
ede0: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
edf0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
ee00: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
ee10: 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a   x.nNeeded = 0;.
ee20: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
ee30: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
ee40: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
ee50: 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e  f(Mem));.    p->
ee60: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
ee70: 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e  e(&x, p->aVar, n
ee80: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Var*sizeof(Mem))
ee90: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
eea0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
eeb0: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
eec0: 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20  izeof(Mem*));.  
eed0: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c    p->apCsr = all
eee0: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
eef0: 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69  pCsr, nCursor*si
ef00: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
ef10: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
ef20: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
ef30: 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e  ANSTATUS.    p->
ef40: 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70  anExec = allocSp
ef50: 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65  ace(&x, p->anExe
ef60: 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  c, p->nOp*sizeof
ef70: 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
ef80: 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64     if( x.nNeeded
ef90: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
efa0: 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70   x.pSpace = p->p
efb0: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
efc0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
efd0: 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  x.nNeeded);.    
efe0: 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65  x.nFree = x.nNee
eff0: 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21  ded;.  }while( !
f000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f010: 20 29 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74   );..  p->pVList
f020: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73   = pParse->pVLis
f030: 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c  t;.  pParse->pVL
f040: 69 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65  ist =  0;.  p->e
f050: 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
f060: 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20  >explain;.  if( 
f070: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f080: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20   ){.    p->nVar 
f090: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72  = 0;.    p->nCur
f0a0: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  sor = 0;.    p->
f0b0: 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nMem = 0;.  }els
f0c0: 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  e{.    p->nCurso
f0d0: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20  r = nCursor;.   
f0e0: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
f0f0: 72 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74  r)nVar;.    init
f100: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
f110: 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f  , nVar, db, MEM_
f120: 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d  Null);.    p->nM
f130: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69  em = nMem;.    i
f140: 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  nitMemArray(p->a
f150: 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d  Mem, nMem, db, M
f160: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20  EM_Undefined);. 
f170: 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43     memset(p->apC
f180: 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73  sr, 0, nCursor*s
f190: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
f1a0: 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  *));.#ifdef SQLI
f1b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
f1c0: 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65  CANSTATUS.    me
f1d0: 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20  mset(p->anExec, 
f1e0: 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  0, p->nOp*sizeof
f1f0: 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
f200: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
f210: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
f220: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
f230: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
f240: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
f250: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
f260: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
f270: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
f280: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
f290: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
f2a0: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
f2b0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
f2c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
f2d0: 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
f2e0: 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65  Btx==0 || pCx->e
f2f0: 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
f300: 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74  _BTREE );.  swit
f310: 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70  ch( pCx->eCurTyp
f320: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55  e ){.    case CU
f330: 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a  RTYPE_SORTER: {.
f340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f350: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
f360: 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20  db, pCx);.      
f370: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f380: 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54   case CURTYPE_BT
f390: 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  REE: {.      if(
f3a0: 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61   pCx->isEphemera
f3b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
f3c0: 20 70 43 78 2d 3e 70 42 74 78 20 29 20 73 71 6c   pCx->pBtx ) sql
f3d0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
f3e0: 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20  Cx->pBtx);.     
f3f0: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
f400: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
f410: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
f420: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
f430: 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  , by.        ** 
f440: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
f450: 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
f460: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f470: 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  pCx->uc.pCursor!
f480: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
f490: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
f4a0: 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43  ursor(pCx->uc.pC
f4b0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
f4c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f4d0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4e0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f4f0: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52  BLE.    case CUR
f500: 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20  TYPE_VTAB: {.   
f510: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
f520: 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20  cursor *pVCur = 
f530: 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20  pCx->uc.pVCur;. 
f540: 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74       const sqlit
f550: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
f560: 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61  le = pVCur->pVta
f570: 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
f580: 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d    assert( pVCur-
f590: 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29  >pVtab->nRef>0 )
f5a0: 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70  ;.      pVCur->p
f5b0: 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Vtab->nRef--;.  
f5c0: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
f5d0: 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20  ose(pVCur);.    
f5e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f5f0: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
f600: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
f610: 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72  sors in the curr
f620: 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74  ent frame..*/.st
f630: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43  atic void closeC
f640: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64  ursorsInFrame(Vd
f650: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
f660: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
f670: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
f680: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
f690: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
f6a0: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
f6b0: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
f6c0: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
f6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
f6e0: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
f6f0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
f700: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
f710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f720: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
f730: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
f740: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
f750: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
f760: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
f770: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
f780: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
f790: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
f7a0: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
f7b0: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
f7c0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
f7d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
f7e0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
f7f0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f800: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
f810: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f  pFrame->v;.  clo
f820: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f830: 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (v);.#ifdef SQLI
f840: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
f850: 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61  CANSTATUS.  v->a
f860: 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e  nExec = pFrame->
f870: 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20  anExec;.#endif. 
f880: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
f890: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
f8a0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
f8b0: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
f8c0: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
f8d0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
f8e0: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
f8f0: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
f900: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
f910: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
f920: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
f930: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
f940: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
f950: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
f960: 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e  hange;.  v->db->
f970: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
f980: 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73  ->nDbChange;.  s
f990: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
f9a0: 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26  AuxData(v->db, &
f9b0: 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  v->pAuxData, -1,
f9c0: 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61   0);.  v->pAuxDa
f9d0: 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75  ta = pFrame->pAu
f9e0: 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d  xData;.  pFrame-
f9f0: 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20  >pAuxData = 0;. 
fa00: 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e   return pFrame->
fa10: 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  pc;.}../*.** Clo
fa20: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  se all cursors..
fa30: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61  **.** Also relea
fa40: 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d  se any dynamic m
fa50: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
fa60: 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65  e VM in the Vdbe
fa70: 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a  .aMem memory .**
fa80: 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69   cell array. Thi
fa90: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61  s is necessary a
faa0: 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  s the memory cel
fab0: 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74  l array may cont
fac0: 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ain.** pointers 
fad0: 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  to VdbeFrame obj
fae0: 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ects, which may 
faf0: 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20  in turn contain 
fb00: 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f  pointers to.** o
fb10: 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  pen cursors..*/.
fb20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
fb30: 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65  eAllCursors(Vdbe
fb40: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
fb50: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
fb60: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
fb70: 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
fb80: 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
fb90: 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
fba0: 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
fbb0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
fbc0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
fbd0: 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  pFrame);.    p->
fbe0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  pFrame = 0;.    
fbf0: 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->nFrame = 0;. 
fc00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
fc10: 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63  nFrame==0 );.  c
fc20: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
fc30: 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  me(p);.  if( p->
fc40: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
fc50: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
fc60: 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  Mem, p->nMem);. 
fc70: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
fc80: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
fc90: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
fca0: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
fcb0: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
fcc0: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
fcd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fce0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
fcf0: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  l);.  }..  /* De
fd00: 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61  lete any auxdata
fd10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
fd20: 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20  e by the VM */. 
fd30: 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61   if( p->pAuxData
fd40: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65   ) sqlite3VdbeDe
fd50: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64  leteAuxData(p->d
fd60: 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
fd70: 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
fd80: 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
fd90: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  0 );.}../*.** Cl
fda0: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
fdb0: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e  ter a single run
fdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fdd0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
fde0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
fdf0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65   = p->db;..#ifde
fe00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
fe10: 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
fe20: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
fe30: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
fe40: 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
fe50: 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
fe60: 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
fe70: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
fe80: 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
fe90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
fea0: 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
feb0: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
fec0: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
fed0: 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
fee0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
fef0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ff00: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
ff10: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
ff20: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
ff30: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
ff40: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
ff50: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
ff60: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
ff70: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
ff80: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
ff90: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
ffa0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
ffb0: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
ffc0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
ffd0: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
ffe0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
fff0: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
10000 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
10010 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
10020 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
10030 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
10040 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
10050 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
10060 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
10070 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
10080 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
10090 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
100a0 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
100b0 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
100c0 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
100d0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
100e0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
100f0 20 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75   if( p->nResColu
10100 6d 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  mn ){.    releas
10110 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
10120 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
10130 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
10140 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
10150 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
10160 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e  me);.  }.  n = n
10170 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
10180 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
10190 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
101a0 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
101b0 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
101c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
101d0 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
101e0 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
101f0 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
10200 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
10210 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
10220 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  e, n, db, MEM_Nu
10230 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ll);.}../*.** Se
10240 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
10250 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
10260 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
10270 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
10280 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
10290 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
102a0 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
102b0 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
102c0 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
102d0 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
102e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
102f0 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
10300 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
10310 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
10320 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
10330 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
10340 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
10350 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
10360 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
10370 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
10380 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
10390 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
103a0 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
103b0 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
103c0 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
103d0 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
103e0 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
103f0 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
10400 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
10430 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
10440 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10470 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
10480 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
10490 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104b0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
104c0 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
104d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
104e0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
104f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10500 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
10510 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
10520 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
10530 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
10540 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
10550 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
10560 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
10570 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
10580 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
10590 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
105a0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
105b0 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
105c0 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
105d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
105e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
105f0 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
10600 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
10610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10620 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
10630 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
10640 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
10650 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
10660 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
10670 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
10680 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10690 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
106a0 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
106b0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
106c0 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
106d0 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
106e0 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
106f0 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
10700 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
10710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
10720 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
10730 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
10740 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
10750 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
10760 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
10770 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
10780 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
10790 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
107a0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
107b0 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
107c0 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
107d0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
107e0 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
107f0 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
10800 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
10810 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
10820 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
10830 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
10840 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
10850 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
10860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
10870 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
10880 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
10890 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nsaction.       
108a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
108b0 68 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74  hat are candidat
108c0 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61  es for a two-pha
108d0 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20  se commit using 
108e0 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
108f0 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a       ** master-j
10900 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
10910 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10920 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
10930 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
10940 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10950 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
10960 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
10970 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
10980 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
10990 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
109a0 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
109b0 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
109c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
109d0 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
109e0 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
109f0 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
10a00 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
10a10 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
10a20 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
10a30 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
10a40 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
10a50 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
10a60 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
10a70 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
10a80 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
10a90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10aa0 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
10ab0 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
10ac0 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
10ad0 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
10ae0 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
10af0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
10b00 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
10b10 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
10b20 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
10b30 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
10b40 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
10b50 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
10b60 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
10b70 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
10b80 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
10b90 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
10ba0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
10bb0 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
10bc0 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
10bd0 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
10be0 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
10bf0 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
10c00 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
10c10 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
10c20 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10c30 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
10c40 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
10c50 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
10c60 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
10c70 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
10c80 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
10c90 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
10ca0 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
10cb0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
10cc0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
10cd0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
10ce0 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
10cf0 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20    /* Whether or 
10d00 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d  not a database m
10d10 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74  ight need a mast
10d20 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e  er journal depen
10d30 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a  ds upon.      **
10d40 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   its journal mod
10d50 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74  e (among other t
10d60 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61  hings).  This ma
10d70 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20  trix determines 
10d80 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a  which.      ** j
10d90 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65  ournal modes use
10da0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10db0 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e  l and which do n
10dc0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  ot */.      stat
10dd0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e  ic const u8 aMJN
10de0 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  eeded[] = {.    
10df0 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20      /* DELETE   
10e00 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f  */  1,.        /
10e10 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31  * PERSIST   */ 1
10e20 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46  ,.        /* OFF
10e30 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20         */ 0,.   
10e40 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45       /* TRUNCATE
10e50 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20    */ 1,.        
10e60 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20  /* MEMORY    */ 
10e70 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41  0,.        /* WA
10e80 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20  L       */ 0.   
10e90 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65     };.      Page
10ea0 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20  r *pPager;   /* 
10eb0 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64  Pager associated
10ec0 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20   with pBt */.   
10ed0 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
10ee0 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
10ef0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
10f00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d  ;.      pPager =
10f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
10f20 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  er(pBt);.      i
10f30 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61  f( db->aDb[i].sa
10f40 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45  fety_level!=PAGE
10f50 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
10f60 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e  F.       && aMJN
10f70 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67  eeded[sqlite3Pag
10f80 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
10f90 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20  (pPager)].      
10fa0 29 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  ){ .        asse
10fb0 72 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20  rt( i!=1 );.    
10fc0 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20      nTrans++;.  
10fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
10fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
10ff0 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
11000 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
11010 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
11020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
11060 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
11070 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
11080 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
11090 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
110a0 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
110b0 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
110c0 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
110d0 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
110e0 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
110f0 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
11100 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
11110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11120 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
11130 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
11140 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
11150 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
11160 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
11170 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
11180 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
11190 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
111a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
111b0 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
111c0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
111d0 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
111e0 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
111f0 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
11200 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
11210 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
11220 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
11230 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
11240 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
11250 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
11260 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
11270 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
11280 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
11290 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
112a0 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
112b0 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
112c0 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
112d0 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
112e0 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
112f0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
11300 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
11310 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
11320 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
11330 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
11340 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11350 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
11360 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11370 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11380 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11390 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
113a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
113b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
113c0 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
113d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
113e0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
113f0 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
11400 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
11410 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
11420 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
11430 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
11440 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
11450 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
11460 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
11470 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
11480 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
11490 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
114a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
114b0 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
114c0 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
114d0 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
114e0 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
114f0 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
11500 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
11510 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
11520 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
11530 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
11540 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
11550 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11560 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11570 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
11580 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11590 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
115a0 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
115b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
115c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
115d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
115e0 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
115f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
11600 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
11610 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
11620 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
11630 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
11640 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
11650 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
11660 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
11670 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
11680 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
11690 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tted atomically.
116a0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
116b0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
116c0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
116d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
116e0 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63   db->pVfs;.    c
116f0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
11700 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
11710 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
11720 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
11730 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
11740 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
11750 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
11760 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
11770 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
11780 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
11790 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
117a0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
117b0 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
117c0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
117d0 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
117e0 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
117f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11800 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
11810 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
11820 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
11830 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
11840 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11850 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
11860 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
11870 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
11880 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
11890 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
118a0 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  T;.    do {.    
118b0 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
118c0 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
118d0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
118e0 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
118f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
11900 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
11910 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
11920 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
11930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11940 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
11950 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
11960 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11980 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
11990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
119a0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
119b0 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
119c0 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
119d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
119e0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
119f0 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
11a00 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
11a10 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
11a20 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
11a30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11a40 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
11a50 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
11a60 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
11a90 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
11aa0 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
11ab0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
11ac0 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
11ad0 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
11ae0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11af0 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
11b00 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
11b10 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
11b20 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
11b30 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
11b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
11b50 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
11b60 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
11b70 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
11b80 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
11b90 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
11ba0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
11bb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
11bc0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
11bd0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
11be0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
11bf0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
11c00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
11c10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11c20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11c30 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
11c40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
11c50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11c60 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
11c70 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
11c80 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
11c90 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
11ca0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
11cb0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
11cc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11cd0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
11ce0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
11cf0 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
11d00 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
11d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11d30 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
11d40 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
11d50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
11d60 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11d70 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
11d80 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
11d90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
11da0 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
11db0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
11dc0 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
11dd0 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
11de0 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
11df0 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
11e00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11e10 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
11e20 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
11e30 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
11e40 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
11e50 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
11e60 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
11e70 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
11e80 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
11e90 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
11ea0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
11eb0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
11ec0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
11ed0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11ee0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11ef0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11f00 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
11f10 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
11f20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
11f30 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
11f40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
11f50 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
11f60 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
11f70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
11f80 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
11f90 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
11fa0 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
11fb0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
11fc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11fd0 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
11fe0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11ff0 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
12000 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74  er, zFile, sqlit
12010 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
12020 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
12030 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
12040 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12050 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
12060 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12080 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
12090 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
120a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
120b0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
120c0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
120d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
120e0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
120f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12100 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
12110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12120 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
12130 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12140 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
12150 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
12160 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
12170 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
12180 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
12190 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73  */.    if( 0==(s
121a0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
121b0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
121c0 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
121d0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
121e0 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
121f0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
12200 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
12210 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
12220 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
12230 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12240 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
12250 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
12260 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12270 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
12280 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12290 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
122a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
122b0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
122c0 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
122d0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
122e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
122f0 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
12300 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
12310 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
12320 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
12330 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
12340 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
12350 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
12360 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
12370 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12380 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
12390 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
123a0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
123b0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
123c0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
123d0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
123e0 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
123f0 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
12400 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
12410 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
12420 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
12430 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
12440 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
12450 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
12460 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12470 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
12480 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
12490 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
124a0 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
124b0 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
124c0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
124d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
124e0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
124f0 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
12500 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12510 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
12520 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
12530 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
12540 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
12550 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
12560 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12570 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
12580 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
12590 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
125a0 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
125b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
125c0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
125d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
125e0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
125f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
12600 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
12610 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12620 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
12630 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
12640 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
12650 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
12660 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
12670 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
12680 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
12690 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
126a0 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
126b0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
126c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
126d0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
126e0 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ter, 1);.    sql
126f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12700 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
12710 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
12720 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
12730 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
12740 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
12750 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
12760 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
12770 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
12780 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
12790 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
127a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
127b0 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
127c0 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
127d0 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
127e0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
127f0 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
12800 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
12810 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
12820 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
12830 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
12840 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
12850 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
12860 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
12870 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
12880 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
12890 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
128a0 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
128b0 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
128c0 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
128d0 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
128e0 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
128f0 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
12900 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12910 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
12920 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
12930 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
12940 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12950 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
12960 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12970 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
12980 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
12990 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
129a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
129b0 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
129c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
129d0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
129e0 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
129f0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12a00 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
12a10 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
12a20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12a30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12a40 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12a50 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
12a60 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41  e sqlite3.nVdbeA
12a70 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69  ctive count vari
12a80 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
12a90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
12aa0 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
12ab0 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
12ac0 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
12ad0 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
12ae0 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
12af0 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
12b00 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
12b10 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
12b20 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
12b30 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
12b40 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
12b50 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
12b60 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
12b70 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
12b80 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
12b90 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
12ba0 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
12bb0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12bc0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
12bd0 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
12be0 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
12bf0 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Write = 0;.  int
12c00 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20   nRead = 0;.  p 
12c10 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
12c20 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
12c30 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
12c40 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74  busy((sqlite3_st
12c50 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20  mt*)p) ){.      
12c60 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
12c70 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
12c80 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
12c90 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
12ca0 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
12cb0 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
12cc0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
12cd0 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
12ce0 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
12cf0 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
12d00 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
12d10 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
12d20 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
12d30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
12d40 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
12d50 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
12d60 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
12d70 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
12d80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
12d90 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
12da0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
12db0 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
12dc0 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
12dd0 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
12de0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
12df0 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
12e00 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
12e10 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12e20 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
12e30 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
12e40 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
12e50 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
12e60 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
12e70 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
12e80 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12e90 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
12ea0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
12eb0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
12ec0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
12ed0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
12ee0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
12ef0 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
12f00 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
12f10 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
12f20 20 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74   int vdbeCloseSt
12f30 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
12f40 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
12f50 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
12f60 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
12f70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12f80 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69  int i;.  const i
12f90 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
12fa0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
12fb0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ..  assert( eOp=
12fc0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12fd0 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
12fe0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
12ff0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
13000 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
13010 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
13020 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
13030 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
13040 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72  point) );..  for
13050 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
13060 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20   i++){ .    int 
13070 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
13080 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
13090 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
130a0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b  ;.    if( pBt ){
130b0 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
130c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
130d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
130e0 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
130f0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
13100 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13110 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
13120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13130 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13140 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
13150 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
13160 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
13170 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
13180 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
13190 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
131a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
131b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
131c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
131d0 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65    }.  db->nState
131e0 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74  ment--;.  p->iSt
131f0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
13200 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13210 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70  K ){.    if( eOp
13220 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
13230 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  BACK ){.      rc
13240 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
13250 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
13260 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
13270 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
13280 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
13290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
132a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
132b0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
132c0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
132d0 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
132e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
132f0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
13300 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13310 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
13320 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
13330 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
13340 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
13350 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
13360 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
13370 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
13380 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  .  ** the statem
13390 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
133a0 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
133b0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
133c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
133d0 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
133e0 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
133f0 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62  tDefCons;.    db
13400 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
13410 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
13420 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72  ImmCons;.  }.  r
13430 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
13440 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
13450 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a  Statement(Vdbe *
13460 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69  p, int eOp){.  i
13470 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65  f( p->db->nState
13480 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
13490 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74  ement ){.    ret
134a0 75 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61  urn vdbeCloseSta
134b0 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a  tement(p, eOp);.
134c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
134d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
134e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
134f0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
13500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
13510 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
13520 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
13530 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13540 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
13550 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
13560 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
13570 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
13580 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13590 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
135a0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
135b0 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
135c0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
135d0 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
135e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
135f0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
13600 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
13610 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
13620 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13630 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
13640 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
13650 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
13660 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
13670 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
13680 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
13690 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
136a0 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
136b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
136c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
136d0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
136e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
136f0 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
13700 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
13710 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13720 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
13730 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
13740 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
13750 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
13760 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
13770 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
13780 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
13790 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
137a0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
137b0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
137c0 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
137d0 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
137e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
137f0 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b  or(p, "FOREIGN K
13800 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
13810 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
13820 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13840 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
13850 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
13860 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
13870 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
13880 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
13890 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
138a0 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
138b0 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
138c0 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
138d0 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
138e0 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
138f0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
13900 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
13910 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
13920 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
13930 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
13940 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
13950 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
13960 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
13970 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
13980 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
13990 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
139a0 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
139b0 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
139c0 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
139d0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
139e0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
139f0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
13a00 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
13a10 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
13a20 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
13a30 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
13a40 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
13a50 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
13a60 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
13a70 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
13a80 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
13a90 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
13aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13ab0 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
13ac0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
13af0 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
13b00 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
13b10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13b20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
13b30 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
13b40 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
13b50 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
13b60 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
13b70 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13b80 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
13b90 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
13ba0 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
13bb0 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
13bc0 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
13bd0 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
13be0 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
13bf0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13c00 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
13c10 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
13c20 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
13c30 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
13c40 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
13c50 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
13c60 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
13c70 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
13c80 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
13c90 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
13ca0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
13cb0 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
13cc0 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
13cd0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
13ce0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13cf0 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
13d00 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
13d10 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
13d20 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
13d30 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
13d40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
13d50 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ..  if( p->magic
13d60 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
13d70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13d80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
13d90 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
13da0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
13db0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13dc0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f  _BKPT;.  }.  clo
13dd0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
13de0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
13df0 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
13e00 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
13e10 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
13e20 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
13e30 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
13e40 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
13e50 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
13e60 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
13e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13e80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
13e90 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
13ea0 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
13eb0 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
13ec0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
13ed0 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
13ee0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13ef0 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
13f00 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
13f10 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
13f20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
13f30 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
13f40 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
13f50 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
13f60 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
13f80 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
13f90 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
13fa0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
13fb0 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
13fc0 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
13fd0 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
13fe0 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
13ff0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
14000 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
14020 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
14030 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
14040 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 20 20  SQLITE_FULL.    
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
14070 45 5f 42 55 53 59 5f 44 45 41 44 4c 4f 43 4b 3b  E_BUSY_DEADLOCK;
14080 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
14090 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
140a0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
140b0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
140c0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
140d0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
140e0 52 52 55 50 54 0a 20 20 20 20 20 20 2a 2a 20 6f  RRUPT.      ** o
140f0 72 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 45  r SQLITE_BUSY_SE
14100 52 56 45 52 2c 20 6e 6f 20 72 6f 6c 6c 62 61 63  RVER, no rollbac
14110 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
14120 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 0a 20  Otherwise, at . 
14130 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 61 20       ** least a 
14140 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
14150 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
14160 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
14170 74 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a  tore the.      *
14180 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  * database to a 
14190 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
141a0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
141b0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
141c0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
141d0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
141e0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
141f0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
14200 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
14210 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
14220 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
14230 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
14240 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
14250 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
14260 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
14270 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
14280 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
14290 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
142a0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
142b0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
142c0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
142d0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
142e0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
142f0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
14300 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
14310 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
14320 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
14330 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
14340 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
14350 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 28  p->readOnly || (
14360 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
14370 52 52 55 50 54 20 26 26 20 6d 72 63 21 3d 53 51  RRUPT && mrc!=SQ
14380 4c 49 54 45 5f 42 55 53 59 29 20 29 7b 0a 20 20  LITE_BUSY) ){.  
14390 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
143a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
143b0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
143c0 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
143d0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
143e0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
143f0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
14400 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
14410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14420 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
14430 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
14440 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
14450 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
14460 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
14470 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
14480 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
14490 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
144a0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
144b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
144c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
144d0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
144e0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
144f0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14500 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
14510 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14520 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
14530 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
14540 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14550 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14570 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
14580 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
14590 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
145a0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
145b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
145c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
145d0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
145e0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
145f0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
14600 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
14610 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
14620 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
14630 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
14640 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
14650 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
14660 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
14670 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
14680 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
14690 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
146a0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
146b0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
146c0 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
146d0 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
146e0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
146f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
14700 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
14710 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
14720 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
14730 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
14740 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
14750 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
14760 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14770 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14780 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14790 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
147a0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
147b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147c0 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
147d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
147e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
147f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
14800 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
14810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14820 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
14830 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
14840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14850 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
14860 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
14870 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14880 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
14890 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
148a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
148b0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
148c0 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
148d0 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
148e0 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
148f0 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
14900 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
14910 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
14920 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
14930 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
14940 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
14950 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
14960 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14970 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
14980 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
14990 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
149a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
149b0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
149c0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
149d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
149e0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
149f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14a10 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
14a20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14a30 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
14a40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
14a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14a60 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14a70 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
14a80 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14a90 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14aa0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
14ab0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ad0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
14ae0 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
14af0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
14b00 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
14b10 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
14b20 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
14b30 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
14b40 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
14b50 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
14b60 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
14b70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b80 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14b90 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14ba0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
14bb0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
14bd0 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
14be0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
14bf0 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
14c00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
14c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
14c20 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
14c30 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
14c40 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14c50 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
14c60 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
14c70 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
14c80 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
14c90 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
14ca0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
14cb0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
14cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14cd0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14ce0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14cf0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
14d10 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
14d20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
14d30 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14d40 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14d50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14d60 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14d70 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
14d80 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
14d90 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
14da0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
14db0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
14dc0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
14dd0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
14de0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14df0 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
14e00 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
14e10 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
14e20 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
14e30 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
14e40 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
14e50 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
14e60 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
14e70 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
14e80 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
14e90 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
14ea0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
14eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14ec0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
14ed0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14ee0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14ef0 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
14f00 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
14f10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
14f20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14f30 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
14f40 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
14f50 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
14f60 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
14f70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14f80 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
14f90 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
14fa0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
14fb0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14fc0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14fd0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14fe0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14ff0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
15000 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15010 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15020 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15030 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
15040 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
15060 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
15070 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
15080 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
15090 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
150a0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
150b0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
150c0 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
150d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
150e0 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
150f0 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
15100 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
15110 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
15120 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
15130 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
15150 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
15160 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
15170 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
15180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15190 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
151a0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
151b0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
151c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
151d0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
151e0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
151f0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
15200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
15210 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
15220 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
15230 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
15240 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
15250 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15260 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
15270 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
15280 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
15290 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
152a0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
152b0 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
152c0 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
152d0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
152e0 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
152f0 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
15300 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
15310 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
15320 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
15330 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
15340 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
15350 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
15360 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
15370 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
15380 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
15390 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
153a0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
153b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
153c0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
153d0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
153e0 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
153f0 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
15400 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
15410 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
15420 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
15430 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
15440 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
15450 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
15460 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
15470 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
15480 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
15490 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
154a0 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
154b0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
154c0 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
154d0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
154e0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
154f0 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
15500 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
15510 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
15520 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
15530 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
15540 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
15550 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
15560 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
15570 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
15580 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
15590 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
155a0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
155b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
155c0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
155d0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
155e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
155f0 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
15600 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
15610 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15620 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
15630 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
15640 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
15650 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
15660 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
15670 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
15680 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
15690 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
156a0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
156b0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
156c0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
156d0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
156e0 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
156f0 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
15700 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
15710 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
15720 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
15730 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
15740 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
15750 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
15760 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15770 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
15780 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
15790 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
157a0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
157b0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
157c0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
157d0 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
157e0 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
157f0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
15800 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
15810 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
15820 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
15830 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
15840 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15850 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
15860 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
15870 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
15880 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
15890 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
158a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
158b0 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
158c0 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c--;.  }else if(
158d0 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
158e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
158f0 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Null(db->pErr);.
15900 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64    }.  db->errCod
15910 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  e = rc;.  return
15920 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
15930 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
15940 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  LOG./*.** If an 
15950 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
15960 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67  LLOG hook is reg
15970 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20  istered and the 
15980 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c  VM has been run,
15990 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a   .** invoke it..
159a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
159b0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
159c0 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
159d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
159e0 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76  fig.xSqllog && v
159f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15a00 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d  && v->zSql && v-
15a10 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68  >pc>=0 ){.    ch
15a20 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20  ar *zExpanded = 
15a30 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
15a40 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29  dSql(v, v->zSql)
15a50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d  ;.    assert( v-
15a60 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
15a70 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  0 );.    if( zEx
15a80 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20  panded ){.      
15a90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15aa0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20  fig.xSqllog(.   
15ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
15ac0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
15ad0 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45  ogArg, v->db, zE
15ae0 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20  xpanded, 1.     
15af0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
15b00 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a  3DbFree(v->db, z
15b10 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d  Expanded);.    }
15b20 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
15b30 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65  efine vdbeInvoke
15b40 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66  Sqllog(x).#endif
15b50 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
15b60 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
15b70 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
15b80 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
15b90 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
15ba0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
15bb0 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
15bc0 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
15bd0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
15be0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
15bf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
15c00 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
15c10 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
15c20 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
15c30 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
15c40 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
15c50 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
15c60 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
15c70 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
15c80 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
15c90 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
15ca0 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
15cb0 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
15cc0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
15cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15ce0 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
15cf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15d00 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
15d10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
15d20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
15d30 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
15d40 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
15d50 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
15d60 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
15d70 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
15d80 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
15d90 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
15da0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
15db0 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f  dbeHalt(p);..  /
15dc0 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
15dd0 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
15de0 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
15df0 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
15e00 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
15e10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
15e20 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
15e30 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
15e40 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
15e50 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
15e60 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
15e70 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
15e80 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
15e90 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
15ea0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
15eb0 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
15ec0 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
15ed0 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
15ee0 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
15ef0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
15f00 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53  .    vdbeInvokeS
15f10 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71  qllog(p);.    sq
15f20 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
15f30 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73  rError(p);.    s
15f40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15f50 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15f60 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
15f70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e  ;.    if( p->run
15f80 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78  OnlyOnce ) p->ex
15f90 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pired = 1;.  }el
15fa0 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
15fb0 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
15fc0 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
15fd0 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
15fe0 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
15ff0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
16000 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
16010 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
16020 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
16030 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
16040 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
16050 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
16060 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
16070 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
16080 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
16090 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
160a0 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45  db, p->rc, p->zE
160b0 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
160c0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
160d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
160e0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
160f0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
16100 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
16110 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
16120 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
16130 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
16140 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
16150 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
16160 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
16170 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
16180 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
16190 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
161a0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
161b0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
161c0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
161d0 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
161e0 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
161f0 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
16200 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
16210 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
16220 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
16230 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
16240 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
16250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
16260 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
16270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
16280 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
16290 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a  char c, pc = 0;.
162a0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
162b0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
162c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
162d0 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d   = p->zSql[i])!=
162e0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
162f0 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20     if( pc=='\n' 
16300 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
16310 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  -- ");.         
16320 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20   putc(c, out);. 
16330 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b           pc = c;
16340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16350 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20     if( pc!='\n' 
16360 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
16370 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
16380 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16390 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
163a0 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31       char zHdr[1
163b0 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  00];.        sql
163c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
163d0 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72  zeof(zHdr), zHdr
163e0 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38  , "%6u %12llu %8
163f0 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20  llu ",.         
16400 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
16410 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
16420 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
16430 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
16440 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
16450 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
16460 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
16470 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
16480 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
16490 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20  s", zHdr);.     
164a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
164b0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
164c0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
164d0 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
164e0 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
164f0 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
16500 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
16510 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  ESET;.  return p
16520 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
16530 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
16540 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
16550 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
16560 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
16570 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
16580 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
16590 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
165a0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
165b0 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
165c0 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
165d0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
165e0 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
165f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16600 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
16610 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
16620 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
16630 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
16640 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16650 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
16660 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
16670 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
16680 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
16690 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
166a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
166b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61  ;.}../*.** If pa
166c0 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c  rameter iOp is l
166d0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
166e0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  hen invoke the d
166f0 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a  estructor for.**
16700 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64   all auxiliary d
16710 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72  ata pointers cur
16720 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79  rently cached by
16730 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
16740 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  s.** the first a
16750 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  rgument..**.** O
16760 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65  r, if iOp is gre
16770 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
16780 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  al to zero, then
16790 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
167a0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b  is.** only invok
167b0 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78  ed for those aux
167c0 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
167d0 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20  ters created by 
167e0 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e  the user .** fun
167f0 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79  ction invoked by
16800 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e   the OP_Function
16810 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72   opcode at instr
16820 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a  uction iOp of .*
16830 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20  * VM pVdbe, and 
16840 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a  only then if:.**
16850 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73  .**    * the ass
16860 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  ociated function
16870 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
16880 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20  e 32nd or later 
16890 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20  (counting.**    
168a0 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
168b0 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ight), or.**.** 
168c0 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70     * the corresp
168d0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
168e0 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63  gument mask is c
168f0 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20  lear (where the 
16900 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75  first.**      fu
16910 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
16920 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
16930 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a  bit 0 etc.)..*/.
16940 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16950 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73 71  DeleteAuxData(sq
16960 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61  lite3 *db, AuxDa
16970 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70  ta **pp, int iOp
16980 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77  , int mask){.  w
16990 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
169a0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
169b0 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
169c0 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
169d0 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70  Aux->iAuxOp==iOp
169e0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 41  .          && pA
169f0 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20  ux->iAuxArg>=0. 
16a00 20 20 20 20 20 20 20 20 20 26 26 20 28 70 41 75           && (pAu
16a10 78 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c  x->iAuxArg>31 ||
16a20 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49   !(mask & MASKBI
16a30 54 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72  T32(pAux->iAuxAr
16a40 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
16a50 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
16a60 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29  x->iAuxArg==31 )
16a70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
16a80 2d 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a  ->xDeleteAux ){.
16a90 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
16aa0 65 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70  eleteAux(pAux->p
16ab0 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
16ac0 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
16ad0 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20  pNextAux;.      
16ae0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16af0 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c  , pAux);.    }el
16b00 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70  se{.      pp= &p
16b10 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20  Aux->pNextAux;. 
16b20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16b30 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
16b40 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
16b50 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
16b60 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
16b70 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
16b80 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
16b90 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
16ba0 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
16bb0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
16bc0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
16bd0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
16be0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
16bf0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
16c00 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
16c10 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
16c20 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
16c30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16c40 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16c50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
16c60 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
16c70 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
16c80 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16c90 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
16ca0 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
16cb0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
16cc0 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73  b, *pNext;.  ass
16cd0 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
16ce0 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
16cf0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
16d00 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
16d10 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
16d20 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
16d30 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
16d40 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
16d50 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
16d60 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
16d70 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
16d80 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
16d90 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
16da0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16db0 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pSub);.  }.  if(
16dc0 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
16dd0 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
16de0 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
16df0 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
16e00 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ar);.    sqlite3
16e10 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56  DbFree(db, p->pV
16e20 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
16e30 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16e40 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64  pFree);.  }.  vd
16e50 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
16e60 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
16e70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16e80 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
16e90 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
16ea0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
16eb0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16ec0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
16ed0 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20  NSTATUS.  {.    
16ee0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
16ef0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
16f00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
16f10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16f20 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
16f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16f40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16f50 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e  >aScan);.  }.#en
16f60 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
16f70 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
16f80 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
16f90 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
16fa0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
16fb0 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
16fc0 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
16fd0 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
16fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16ff0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
17000 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
17010 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
17020 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  bject(db, p);.  
17030 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
17040 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
17050 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
17060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
17070 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
17080 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
17090 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
170a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
170b0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
170c0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
170d0 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  rev;.  }.  p->ma
170e0 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
170f0 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d  _DEAD;.  p->db =
17100 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
17110 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  reeNN(db, p);.}.
17120 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
17130 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
17140 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
17150 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
17160 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
17170 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
17180 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
17190 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
171a0 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
171b0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
171c0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
171d0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
171e0 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
171f0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
17200 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
17210 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
17220 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
17230 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
17240 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
17250 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
17260 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
17270 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
17280 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
17290 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
172a0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
172b0 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  TREE );.  rc = s
172c0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
172d0 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e  oUnpacked(p->uc.
172e0 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
172f0 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
17300 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
17310 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
17320 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
17330 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17340 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53  T_BKPT;.#ifdef S
17350 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
17360 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
17370 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t++;.#endif.  p-
17380 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
17390 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  = 0;.  p->cacheS
173a0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
173b0 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ALE;.  return SQ
173c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
173d0 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
173e0 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22  moved cursor "p"
173f0 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20   out of place.  
17400 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74  Maybe the row it
17410 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20   was.** pointed 
17420 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  to was deleted o
17430 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74  ut from under it
17440 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20  .  Or maybe the 
17450 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62  btree was.** reb
17460 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76  alanced.  Whatev
17470 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72  er the cause, tr
17480 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22  y to restore "p"
17490 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74   to the place it
174a0 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20  .** is supposed 
174b0 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
174c0 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
174d0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
174e0 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
174f0 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
17500 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
17510 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
17520 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
17530 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
17540 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
17550 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
17560 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
17570 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
17580 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
17590 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
175a0 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70   assert( p->uc.p
175b0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
175c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
175d0 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
175e0 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
175f0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
17600 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
17610 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73  tore(p->uc.pCurs
17620 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
17630 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
17640 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
17650 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
17660 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
17670 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
17680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17690 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
176a0 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
176b0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
176c0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
176d0 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
176e0 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
176f0 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
17700 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
17710 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17720 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
17730 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
17740 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  {.  assert( p->e
17750 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
17760 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20  _BTREE );.  if( 
17770 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17780 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
17790 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
177a0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
177b0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
177c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
177d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
177e0 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
177f0 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
17800 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
17810 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
17820 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
17830 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
17840 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
17850 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
17860 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
17870 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
17880 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
17890 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
178a0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
178b0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
178c0 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
178d0 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
178e0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
178f0 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
17900 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
17910 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
17920 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
17930 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
17940 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
17950 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
17960 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
17970 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
17980 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
17990 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
179a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
179b0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
179c0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
179d0 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
179e0 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
179f0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17a00 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
17a10 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
17a20 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17a40 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
17a50 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20  dbeCursor **pp, 
17a60 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56  int *piCol){.  V
17a70 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a  dbeCursor *p = *
17a80 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75  pp;.  if( p->eCu
17a90 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17aa0 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20  TREE ){.    if( 
17ab0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
17ac0 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  o ){.      int i
17ad0 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Map;.      if( p
17ae0 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d  ->aAltMap && (iM
17af0 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b  ap = p->aAltMap[
17b00 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a  1+*piCol])>0 ){.
17b10 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d          *pp = p-
17b20 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
17b30 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d       *piCol = iM
17b40 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ap - 1;.        
17b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17b70 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
17b80 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
17b90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
17ba0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17bb0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
17bc0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
17bd0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
17be0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
17bf0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17c10 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
17c20 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
17c30 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17c40 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
17c50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17c60 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
17c70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
17c80 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17c90 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
17ca0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17cb0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
17cc0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
17cd0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
17ce0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
17cf0 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
17d00 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
17d10 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
17d20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
17d30 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
17d40 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
17d50 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
17d60 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
17d70 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
17d80 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
17d90 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
17da0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
17db0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
17dc0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
17dd0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
17de0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
17df0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
17e00 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
17e10 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
17e20 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
17e30 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
17e40 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
17e50 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
17e60 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
17e70 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
17e80 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
17e90 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
17ea0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
17eb0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
17ec0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
17ed0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
17ee0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
17ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
17f00 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
17f10 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
17f20 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
17f30 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
17f40 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
17f50 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
17f60 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
17f70 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
17f80 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
17f90 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
17fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
17fb0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
17fc0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17fd0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
17fe0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
17ff0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
18000 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
18010 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
18040 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
18050 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
18060 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
18070 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
18080 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
18090 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
180a0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
180b0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
180c0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
180f0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
18100 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
18110 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
18120 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
18130 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
18160 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
18170 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
18180 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
18190 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
181a0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
181b0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
181c0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
181d0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
181e0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
181f0 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
18220 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
18230 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
18240 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
18250 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
18260 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
18270 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
18280 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
18290 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
182a0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
182b0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
182c0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
182d0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
182e0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
182f0 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
18300 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
18310 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18320 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
18330 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
18340 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
18350 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18360 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
18370 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
18380 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20  t, u32 *pLen){. 
18390 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
183a0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20  m->flags;.  u32 
183b0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  n;..  assert( pL
183c0 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  en!=0 );.  if( f
183d0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
183e0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a  .    *pLen = 0;.
183f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18400 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
18410 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
18420 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
18430 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
18440 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
18450 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
18460 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
18470 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
18480 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
18490 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
184a0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
184b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
184c0 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
184d0 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
184e0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
184f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
18500 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
18510 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
18520 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
18530 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
18540 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
18550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
18560 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
18570 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
18580 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18590 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
185a0 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
185b0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
185c0 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
185d0 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
185e0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
185f0 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
18600 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
18610 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
18620 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
18630 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
18640 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
18650 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
18660 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
18670 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Real ){.    *pLe
18680 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
18690 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
186a0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
186b0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
186c0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
186d0 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
186e0 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
186f0 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
18700 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
18710 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
18720 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
18730 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c  nZero;.  }.  *pL
18740 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  en = n;.  return
18750 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
18760 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
18770 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
18780 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72  he sizes for ser
18790 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74  ial types less t
187a0 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69  han 128.*/.stati
187b0 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
187c0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
187d0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
187e0 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33  *  0   1   2   3
187f0 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37     4   5   6   7
18800 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f     8   9 */   ./
18810 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31  *   0 */   0,  1
18820 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36  ,  2,  3,  4,  6
18830 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30  ,  8,  8,  0,  0
18840 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c  ,./*  10 */   0,
18850 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
18860 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c    1,  2,  2,  3,
18870 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20    3,./*  20 */  
18880 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20   4,  4,  5,  5, 
18890 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20   6,  6,  7,  7, 
188a0 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a   8,  8,./*  30 *
188b0 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31  /   9,  9, 10, 1
188c0 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31  0, 11, 11, 12, 1
188d0 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34  2, 13, 13,./*  4
188e0 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35  0 */  14, 14, 15
188f0 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37  , 15, 16, 16, 17
18900 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a  , 17, 18, 18,./*
18910 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c    50 */  19, 19,
18920 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c   20, 20, 21, 21,
18930 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c   22, 22, 23, 23,
18940 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20  ./*  60 */  24, 
18950 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20  24, 25, 25, 26, 
18960 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20  26, 27, 27, 28, 
18970 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32  28,./*  70 */  2
18980 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33  9, 29, 30, 30, 3
18990 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33  1, 31, 32, 32, 3
189a0 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f  3, 33,./*  80 */
189b0 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35    34, 34, 35, 35
189c0 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37  , 36, 36, 37, 37
189d0 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30  , 38, 38,./*  90
189e0 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c   */  39, 39, 40,
189f0 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c   40, 41, 41, 42,
18a00 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20   42, 43, 43,./* 
18a10 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20  100 */  44, 44, 
18a20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20  45, 45, 46, 46, 
18a30 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a  47, 47, 48, 48,.
18a40 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34  /* 110 */  49, 4
18a50 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35  9, 50, 50, 51, 5
18a60 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35  1, 52, 52, 53, 5
18a70 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34  3,./* 120 */  54
18a80 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36  , 54, 55, 55, 56
18a90 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a  , 56, 57, 57.};.
18aa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18ab0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
18ac0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
18ad0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
18ae0 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
18af0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
18b00 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18b10 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
18b20 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
18b30 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ype>=128 ){.    
18b40 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
18b50 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
18b60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
18b70 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a  serial_type<12 .
18b80 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
18b90 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18ba0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18bb0 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ]==(serial_type 
18bc0 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72  - 12)/2 );.    r
18bd0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
18be0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
18bf0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
18c00 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e  u8 sqlite3VdbeOn
18c10 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c  eByteSerialTypeL
18c20 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70  en(u8 serial_typ
18c30 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65  e){.  assert( se
18c40 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b  rial_type<128 );
18c50 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
18c60 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
18c70 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a  serial_type];  .
18c80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
18c90 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
18ca0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
18cb0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
18cc0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
18cd0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
18ce0 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
18cf0 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
18d00 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
18d10 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
18d20 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
18d30 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
18d40 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
18d50 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
18d60 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
18d70 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
18d80 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
18d90 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
18da0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
18db0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
18dc0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
18dd0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
18de0 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
18df0 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
18e00 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
18e10 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
18e20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
18e30 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
18e40 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
18e50 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
18e60 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
18e70 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
18e80 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
18e90 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
18ea0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
18eb0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
18ec0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
18ed0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
18ee0 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
18ef0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
18f00 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
18f10 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
18f20 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
18f30 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
18f40 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
18f50 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
18f60 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
18f70 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
18f80 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
18f90 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
18fa0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
18fb0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
18fc0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
18fd0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
18fe0 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
18ff0 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
19000 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
19010 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
19020 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
19030 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
19040 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
19050 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
19060 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
19070 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
19080 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
19090 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
190a0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
190b0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
190c0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
190d0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
190e0 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
190f0 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
19100 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
19110 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
19120 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
19130 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
19140 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
19150 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
19160 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
19170 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
19180 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
19190 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
191a0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
191b0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
191c0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
191d0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
191e0 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
191f0 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
19200 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
19210 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
19220 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
19230 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
19240 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
19250 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
19260 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
19270 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
19280 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
19290 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
192a0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
192b0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
192c0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
192d0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
192e0 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
192f0 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
19300 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
19310 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
19320 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
19330 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
19340 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
19350 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
19360 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
19370 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
19380 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
19390 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
193a0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
193b0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
193c0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
193d0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
193e0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
193f0 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
19400 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
19410 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
19420 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
19430 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
19440 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
19450 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
19460 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
19470 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
19480 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
19490 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
194a0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
194b0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
194c0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
194d0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
194e0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
194f0 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
19500 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
19510 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
19520 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
19530 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
19540 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
19550 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
19560 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
19570 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
19580 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
19590 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
195a0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
195b0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
195c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
195d0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
195e0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
195f0 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
19600 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
19610 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
19620 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
19630 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
19640 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
19650 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
19660 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
19670 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
19680 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
19690 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
196a0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
196b0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
196c0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
196d0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
196e0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
196f0 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
19700 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
19710 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
19720 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
19730 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19740 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
19750 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
19760 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
19770 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
19780 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
19790 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
197a0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
197b0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
197c0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
197d0 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
197e0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
197f0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
19800 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
19810 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
19820 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
19830 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
19840 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
19850 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
19860 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
19870 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
19880 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
19890 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
198a0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
198b0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
198c0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
198d0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
198e0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
198f0 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
19900 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
19910 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
19920 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
19930 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20      if( len>0 ) 
19940 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
19950 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
19960 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
19970 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
19980 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
19990 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
199a0 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
199b0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
199c0 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
199d0 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
199e0 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
199f0 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
19a00 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
19a10 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
19a20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
19a30 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
19a40 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
19a50 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
19a60 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
19a70 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
19a80 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
19a90 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
19aa0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
19ab0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
19ac0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
19ad0 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
19ae0 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
19af0 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
19b00 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
19b10 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
19b20 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
19b30 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
19b40 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
19b50 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
19b60 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
19b70 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
19b80 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
19b90 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
19ba0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
19bb0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
19bc0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
19bd0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
19be0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
19bf0 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
19c00 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
19c10 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
19c20 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
19c30 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
19c40 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
19c50 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
19c60 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
19c70 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
19c80 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
19c90 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
19ca0 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
19cb0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
19cc0 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
19cd0 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
19ce0 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
19cf0 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
19d00 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
19d10 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
19d20 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
19d30 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
19d40 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
19d50 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
19d60 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
19d70 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
19d80 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19d90 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
19dc0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
19dd0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
19de0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
19df0 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
19e00 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
19e10 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
19e20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
19e30 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
19e40 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
19e50 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
19e60 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
19e70 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
19e80 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
19e90 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19ea0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
19eb0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
19ec0 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
19ed0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19ee0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19ef0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
19f00 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
19f10 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
19f20 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
19f30 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
19f40 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
19f50 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
19f60 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
19f70 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
19f80 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
19f90 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19fa0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
19fb0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
19fc0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
19fd0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19fe0 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
19ff0 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
1a000 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
1a010 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
1a020 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
1a030 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
1a040 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
1a050 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a060 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
1a070 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
1a080 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
1a090 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a0a0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
1a0b0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
1a0c0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1a0d0 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
1a0e0 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
1a0f0 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
1a100 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
1a110 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1a120 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
1a130 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
1a140 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
1a150 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
1a160 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1a170 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
1a180 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
1a190 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
1a1a0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
1a1b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
1a1c0 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
1a1d0 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
1a1e0 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
1a1f0 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
1a200 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
1a210 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
1a220 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
1a230 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a240 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
1a250 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
1a260 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1a270 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
1a280 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
1a290 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
1a2a0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1a2b0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
1a2c0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
1a2d0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1a2e0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1a2f0 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
1a300 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
1a310 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1a320 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1a330 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
1a340 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
1a350 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
1a360 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
1a370 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1a380 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
1a390 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
1a3a0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a3b0 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
1a3c0 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
1a3d0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a3e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1a3f0 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
1a400 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1a410 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1a420 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
1a430 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
1a440 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
1a450 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
1a460 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
1a470 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a480 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
1a490 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a4a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a4b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a4c0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a4d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a4e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1a4f0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1a500 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a510 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a520 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
1a530 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
1a540 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
1a550 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a560 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a570 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a580 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
1a590 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1a5a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1a5b0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1a5c0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1a5d0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1a5e0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
1a5f0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1a600 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1a610 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1a620 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1a630 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
1a640 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1a650 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
1a660 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1a670 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1a680 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1a690 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1a6a0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a6b0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a6c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a6d0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a6e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1a6f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1a700 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1a710 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a720 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a730 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1a740 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1a750 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1a760 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a770 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a780 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a790 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1a7a0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1a7b0 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1a7c0 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1a7d0 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1a7e0 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1a7f0 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1a800 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1a810 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1a820 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1a830 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1a840 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1a850 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a860 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a870 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a880 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a890 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1a8a0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1a8b0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a8c0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a8d0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1a8e0 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1a8f0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1a900 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a910 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a920 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a930 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a940 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1a950 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1a960 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1a970 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a980 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a990 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a9a0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a9b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1a9c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a9d0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1a9e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a9f0 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1aa00 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1aa10 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1aa20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1aa30 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1aa40 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1aa50 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1aa60 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1aa70 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1aa80 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1aa90 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1aaa0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1aab0 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1aac0 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1aad0 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1aae0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1aaf0 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1ab00 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1ab10 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1ab20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ab30 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1ab40 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1ab50 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1ab60 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1ab70 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1ab80 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1ab90 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1aba0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1abb0 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1abc0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1abd0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1abe0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1abf0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1ac00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1ac10 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1ac20 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1ac30 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1ac40 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1ac50 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1ac60 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1ac70 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1ac80 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1ac90 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1aca0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1acb0 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1acc0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1acd0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1ace0 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1acf0 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1ad00 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1ad10 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1ad20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1ad30 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1ad40 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1ad50 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1ad60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1ad70 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1ad80 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1ad90 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1ada0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1adb0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1adc0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1add0 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1ade0 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1adf0 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1ae00 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1ae10 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1ae20 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1ae30 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1ae40 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1ae50 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1ae60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1ae70 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1ae80 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1ae90 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1aea0 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1aeb0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1aec0 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1aed0 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1aee0 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1aef0 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1af00 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1af10 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1af20 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1af30 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1af40 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1af50 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1af60 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1af70 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1af80 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1af90 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1afa0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1afb0 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1afc0 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1afd0 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1afe0 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1aff0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1b000 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1b010 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1b020 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1b030 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1b040 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1b050 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1b060 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1b070 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1b080 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1b090 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fo              
1b0a0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1b0b0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1b0c0 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1b0d0 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1b0e0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1b0f0 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1b100 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
1b110 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1b120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b130 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1b140 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20  red for *p */.  
1b150 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1b160 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1b170 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1b180 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1b190 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d  nField+1);.  p =
1b1a0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1b1b0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1b1c0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1b1d0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
1b1e0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1b1f0 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
1b200 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
1b210 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1b220 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
1b230 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b240 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1b250 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
1b260 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1b270 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
1b280 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1b290 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1b2a0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1b2b0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1b2c0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1b2d0 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1b2e0 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1b2f0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1b300 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1b310 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1b320 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1b330 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1b340 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1b350 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1b360 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1b370 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1b380 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1b390 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1b3a0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1b3b0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1b3c0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1b3d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b3e0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1b3f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1b400 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1b410 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1b420 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1b430 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1b440 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1b450 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1b460 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1b470 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b480 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1b490 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b4a0 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
1b4b0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b4e0 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1b4f0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1b500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1b520 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1b530 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1b540 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1b550 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1b560 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1b570 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1b580 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1b590 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1b5a0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1b5b0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1b5c0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1b5d0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1b5e0 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
1b5f0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1b600 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1b610 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1b620 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1b630 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1b640 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1b650 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1b660 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1b670 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1b680 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1b690 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b6a0 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1b6b0 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1b6c0 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1b6d0 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  c = 0;.    pMem-
1b6e0 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  >z = 0;.    d +=
1b6f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b700 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1b710 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1b720 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1b730 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1b740 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1b750 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1b760 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
1b770 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
1b780 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
1b790 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b7a0 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
1b7b0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1b7c0 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62  two index or tab
1b7d0 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69  le record keys i
1b7e0 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a  n the same way.*
1b7f0 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  * as the sqlite3
1b800 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b810 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c  e() routine. Unl
1b820 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ike VdbeRecordCo
1b830 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73  mpare(),.** this
1b840 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1b850 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61  alizes and compa
1b860 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67  res values using
1b870 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56   the.** sqlite3V
1b880 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
1b890 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nd sqlite3MemCom
1b8a0 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73  pare() functions
1b8b0 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  . It is used.** 
1b8c0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1b8d0 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
1b8e0 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
1b8f0 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73  zed code in.** s
1b900 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b910 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e  Compare() return
1b920 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74  s results with t
1b930 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69  hese two primiti
1b940 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ves..**.** Retur
1b950 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65  n true if the re
1b960 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
1b970 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  on is equivalent
1b980 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c   to desiredResul
1b990 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  t..** Return fal
1b9a0 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  se if there is a
1b9b0 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a   disagreement..*
1b9c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1b9d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1b9e0 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  bug(.  int nKey1
1b9f0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1ba00 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1ba10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61   */.  const Unpa
1ba20 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1ba30 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79  y2, /* Right key
1ba40 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65   */.  int desire
1ba50 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  dResult         
1ba60 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61      /* Correct a
1ba70 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33  nswer */.){.  u3
1ba80 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1ba90 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1baa0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1bab0 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1bac0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1bad0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1bae0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1baf0 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
1bb00 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
1bb10 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1bb20 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
1bb30 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
1bb40 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1bb50 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
1bb60 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1bb70 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1bb80 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1bb90 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1bba0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
1bbb0 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
1bbc0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1bbd0 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1bbe0 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
1bbf0 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d   1;.  mem1.enc =
1bc00 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1bc10 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1bc20 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d  Info->db;.  /* m
1bc30 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20  em1.flags = 0;  
1bc40 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69  // Will be initi
1bc50 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alized by sqlite
1bc60 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1bc70 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   */.  VVA_ONLY( 
1bc80 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
1bc90 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1bca0 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1bcb0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
1bcc0 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
1bcd0 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
1bce0 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
1bcf0 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
1bd00 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
1bd10 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
1bd20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
1bd30 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
1bd40 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
1bd50 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
1bd60 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
1bd70 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
1bd80 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
1bd90 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
1bda0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
1bdb0 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
1bdc0 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
1bdd0 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
1bde0 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
1bdf0 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
1be00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1be10 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
1be20 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
1be30 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
1be40 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
1be50 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
1be60 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
1be70 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
1be80 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
1be90 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
1bea0 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
1beb0 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
1bec0 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
1bed0 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
1bee0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1bef0 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64  dr1);.  if( szHd
1bf00 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72  r1>98307 ) retur
1bf10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bf20 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
1bf30 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1bf40 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1bf50 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
1bf60 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c  PKey2->nField ||
1bf70 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1bf80 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1bf90 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1bfa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1bfb0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1bfc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1bfd0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1bfe0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1bff0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1c000 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
1c010 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
1c020 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
1c030 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
1c040 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
1c050 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
1c060 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
1c070 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
1c080 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1c090 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
1c0a0 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
1c0b0 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
1c0c0 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
1c0d0 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
1c0e0 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
1c0f0 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
1c100 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
1c110 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
1c120 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1c130 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
1c140 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
1c150 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
1c160 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
1c170 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
1c180 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
1c190 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
1c1a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1c1b0 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
1c1c0 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
1c1d0 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72  /.    if( d1+ser
1c1e0 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32  ial_type1+2>(u32
1c1f0 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64  )nKey1.     && d
1c200 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  1+sqlite3VdbeSer
1c210 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1c220 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b  l_type1)>(u32)nK
1c230 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ey1 .    ){.    
1c240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c250 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1c260 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
1c270 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
1c280 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1c290 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c2a0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1c2b0 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
1c2c0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
1c2d0 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
1c2e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1c2f0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
1c300 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
1c310 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d  em[i], pKeyInfo-
1c320 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aColl[i]);.    
1c330 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1c340 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1c350 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1c360 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1c370 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66  elow */.      if
1c380 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1c390 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1c3a0 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20       rc = -rc;  
1c3b0 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
1c3c0 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f  sult for DESC so
1c3d0 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
1c3e0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1c3f0 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b  debugCompareEnd;
1c400 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
1c410 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73    }while( idx1<s
1c420 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1c430 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20  2->nField );..  
1c440 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1c450 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1c460 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1c470 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1c480 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1c490 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1c4a0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1c4b0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1c4c0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1c4d0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1c4e0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1c4f0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1c500 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
1c510 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c520 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1c530 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1c540 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
1c550 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1c560 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1c570 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1c580 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1c590 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1c5a0 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1c5b0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1c5c0 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d  /.  rc = pPKey2-
1c5d0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65  >default_rc;..de
1c5e0 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20  bugCompareEnd:. 
1c5f0 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c600 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29  lt==0 && rc==0 )
1c610 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c620 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30   desiredResult<0
1c630 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72   && rc<0 ) retur
1c640 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1c650 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63  edResult>0 && rc
1c660 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  >0 ) return 1;. 
1c670 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1c680 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c690 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ( pKeyInfo->db->
1c6a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1c6b0 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
1c6c0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
1c6d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c6e0 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  UG./*.** Count t
1c6f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
1c700 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75  lds (a.k.a. colu
1c710 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f  mns) in the reco
1c720 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  rd given by.** p
1c730 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76  Key,nKey.  The v
1c740 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1c750 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68  count is less th
1c760 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1c770 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65  he.** limit give
1c780 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  n by pKeyInfo->n
1c790 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f  Field + pKeyInfo
1c7a0 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ->nXField..**.**
1c7b0 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1c7c0 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1c7d0 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1c7e0 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1c7f0 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1c800 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1c810 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c820 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1c830 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1c840 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1c850 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1c860 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1c870 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1c880 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1c890 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65  nfo.nField or Ke
1c8a0 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61  yInfo.nXField va
1c8b0 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1c8c0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1c8d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1c8e0 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1c8f0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1c900 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1c910 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1c920 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1c930 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1c940 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1c950 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1c960 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1c970 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1c980 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1c990 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1c9a0 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1c9b0 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1c9c0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1c9d0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1c9e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c9f0 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1ca00 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1ca10 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1ca20 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1ca30 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1ca40 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1ca50 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1ca60 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1ca70 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1ca80 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1ca90 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1caa0 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1cab0 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1cac0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1cad0 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  <= pKeyInfo->nFi
1cae0 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1caf0 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1cb00 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1cb10 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1cb20 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1cb30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1cb40 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1cb50 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1cb60 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1cb70 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1cb80 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1cb90 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1cba0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1cbb0 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1cbc0 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1cbd0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1cbe0 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1cbf0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1cc00 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1cc10 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1cc20 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1cc30 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1cc40 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1cc50 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1cc60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1cc70 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1cc80 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1cc90 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1cca0 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1ccb0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1ccc0 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1ccd0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1cce0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1ccf0 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1cd00 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1cd10 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1cd20 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1cd30 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1cd40 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1cd50 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1cd60 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1cd70 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1cd80 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1cd90 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1cda0 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1cdb0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1cdc0 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1cdd0 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1cde0 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1cdf0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1ce00 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1ce10 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20  1, *v2;.    Mem 
1ce20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1ce30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ce40 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1ce50 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1ce60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ce70 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1ce80 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1ce90 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1cea0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1ceb0 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1cec0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1ced0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1cee0 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1cef0 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1cf00 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1cf10 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1cf20 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1cf30 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1cf40 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v2 = sqlite3Valu
1cf50 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1cf60 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c  alue*)&c2, pColl
1cf70 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  ->enc);.    if( 
1cf80 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1cf90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
1cfa0 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1cfb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1cfc0 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  PT;.      rc = 0
1cfd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cfe0 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
1cff0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1d000 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e  , c1.n, v1, c2.n
1d010 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , v2);.    }.   
1d020 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1d030 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1d040 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1d050 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1d060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d070 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
1d080 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72  ut pBlob is guar
1d090 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42  anteed to be a B
1d0a0 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lob that is not 
1d0b0 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d  marked.** with M
1d0c0 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e  EM_Zero.  Return
1d0d0 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c   true if it coul
1d0e0 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62  d be a zero-blob
1d0f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d100 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20  isAllZero(const 
1d110 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
1d120 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1d130 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1d140 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72      if( z[i] ) r
1d150 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1d160 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1d170 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1d180 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1d190 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1d1a0 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1d1b0 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1d1c0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1d1d0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1d1e0 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1d1f0 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1d200 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1d210 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1d220 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1d230 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1d240 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  or..*/.static SQ
1d250 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1d260 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1d270 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1d280 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1d290 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1d2a0 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1d2b0 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1d2c0 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1d2d0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1d2e0 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1d2f0 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1d300 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1d310 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1d320 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1d330 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1d340 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1d350 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1d360 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1d370 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1d380 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1d390 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1d3a0 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1d3b0 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1d3c0 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1d3d0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1d3e0 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1d3f0 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1d400 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1d410 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1d420 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1d430 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1d440 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1d450 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1d460 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1d470 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1d480 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1d490 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1d4a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1d4b0 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1d4c0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1d4d0 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1d4e0 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1d4f0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d500 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1d510 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1d520 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1d530 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1d540 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1d550 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1d560 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1d570 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1d580 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1d590 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1d5a0 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1d5b0 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1d5c0 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1d5d0 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1d5e0 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1d5f0 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1d600 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1d610 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1d620 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1d630 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1d640 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1d650 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1d660 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1d670 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1d680 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d690 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1d6a0 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1d6b0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1d6c0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1d6d0 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1d6e0 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1d6f0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1d700 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1d710 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1d720 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1d730 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1d740 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d750 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1d760 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1d770 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1d780 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1d790 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1d7a0 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1d7b0 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1d7c0 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32  1;.    if( r>922
1d7d0 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1d7e0 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1d7f0 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1d800 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1d810 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1d820 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66   i>y ){.      if
1d830 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  ( y==SMALLEST_IN
1d840 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72  T64 && r>0.0 ) r
1d850 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d860 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d  return +1;.    }
1d870 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65  .    s = (double
1d880 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20  )i;.    if( s<r 
1d890 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d8a0 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72   if( s>r ) retur
1d8b0 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1d8c0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1d8d0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1d8e0 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1d8f0 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1d900 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1d910 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1d920 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1d930 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1d940 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1d950 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1d960 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1d970 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1d980 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1d990 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1d9a0 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1d9b0 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1d9c0 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1d9d0 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1d9e0 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1d9f0 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1da00 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1da10 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1da20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1da30 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1da40 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1da50 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1da60 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1da70 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1da80 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1da90 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1daa0 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1dab0 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1dac0 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1dad0 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1dae0 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1daf0 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1db00 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1db10 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1db20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1db30 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1db40 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1db50 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1db60 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1db70 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1db80 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1db90 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1dba0 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1dbb0 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1dbc0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1dbd0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1dbe0 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1dbf0 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1dc00 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ll);.  }..  /* A
1dc10 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
1dc20 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73  he two values is
1dc30 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20   a number.  */. 
1dc40 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1dc50 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
1dc60 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66  _Real) ){.    if
1dc70 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1dc80 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1dc90 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1dca0 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1dcb0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1dcc0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1dcd0 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1dce0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1dcf0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1dd00 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1dd10 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20   & MEM_Real)!=0 
1dd20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1dd30 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d  m1->u.r < pMem2-
1dd40 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.r ) return -1
1dd50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1dd60 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.r > pMem2->
1dd70 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.r ) return +1;
1dd80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1dd90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1dda0 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
1ddb0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1ddc0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1ddd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1dde0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1ddf0 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
1de00 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
1de10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1de20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1de30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1de40 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1de50 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1de60 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
1de70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1de80 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74  turn -sqlite3Int
1de90 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1dea0 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e  m2->u.i, pMem1->
1deb0 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1dec0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1ded0 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1dee0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b    }.    return +
1def0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1df00 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1df10 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1df20 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1df30 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1df40 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1df50 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1df60 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1df70 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1df80 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1df90 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1dfa0 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1dfb0 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1dfc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1dfd0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1dfe0 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1dff0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1e000 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1e010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1e020 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1e030 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62  enc || pMem1->db
1e040 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1e060 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1e070 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1e080 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1e090 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1e0a0 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1e0b0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1e0c0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1e0d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1e0e0 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1e0f0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1e100 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1e110 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1e120 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e130 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1e140 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1e150 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1e160 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1e170 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1e180 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1e190 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1e1a0 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1e1b0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1e1c0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1e1d0 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1e1e0 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1e1f0 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1e200 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1e210 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1e220 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1e230 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1e240 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1e250 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1e260 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1e270 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1e280 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1e290 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1e2a0 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1e2b0 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1e2c0 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1e2d0 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1e2e0 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1e2f0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1e300 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1e310 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1e320 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1e330 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1e340 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1e350 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1e360 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1e370 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1e380 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1e390 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1e3a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1e3b0 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1e3c0 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1e3d0 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1e3e0 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1e3f0 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1e400 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1e410 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1e420 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1e430 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1e440 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1e450 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1e460 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1e470 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1e480 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1e490 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1e4a0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1e4b0 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1e4c0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1e4d0 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1e4e0 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1e4f0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e500 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1e510 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1e520 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1e530 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1e540 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e550 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e560 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1e570 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1e580 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e590 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e5a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1e5b0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1e5c0 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1e5d0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e5e0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e5f0 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1e600 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e610 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e620 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1e630 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1e640 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e650 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e660 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e670 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e680 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1e690 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1e6a0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e6b0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1e6c0 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1e6d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e6e0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1e6f0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e700 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1e710 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1e720 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1e730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e740 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1e750 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1e760 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1e770 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1e780 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1e790 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1e7a0 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1e7b0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1e7c0 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1e7d0 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1e7e0 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1e7f0 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1e800 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1e810 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1e820 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1e830 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1e840 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1e850 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1e860 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1e870 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1e880 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1e890 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1e8a0 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1e8b0 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1e8c0 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1e8d0 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1e8e0 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1e8f0 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1e900 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1e910 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1e920 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1e930 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e940 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1e950 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1e960 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1e970 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1e980 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1e990 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1e9a0 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1e9b0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1e9c0 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1e9d0 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1e9e0 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1e9f0 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1ea00 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1ea10 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1ea20 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1ea30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1ea40 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ea50 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1ea60 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1ea70 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1ea80 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1ea90 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1eaa0 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1eab0 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1eac0 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1ead0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1eae0 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1eaf0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1eb00 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1eb10 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1eb20 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1eb30 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1eb40 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
1eb50 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1eb60 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1eb70 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1eb80 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1eb90 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1eba0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1ebb0 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1ebc0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1ebd0 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1ec00 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1ec10 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1ec20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ec30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1ec40 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1ec50 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1ec60 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1ec70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ec90 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1eca0 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1ecb0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1ece0 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1ecf0 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1ed00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ed10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ed20 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1ed30 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1ed40 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1ed70 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1ed80 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1ed90 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1eda0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1edb0 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1edc0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1edd0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1ede0 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1edf0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1ee00 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1ee10 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1ee20 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1ee30 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1ee40 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1ee50 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1ee60 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1ee70 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1ee80 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ee90 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1eea0 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1eeb0 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1eec0 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1eed0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1eee0 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1eef0 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1ef00 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1ef10 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1ef20 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1ef30 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ef40 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1ef50 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1ef60 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1ef70 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1ef80 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1ef90 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1efa0 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1efb0 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1efc0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1efd0 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1efe0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1eff0 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1f000 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1f010 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1f020 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1f030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f040 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1f050 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1f060 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
1f070 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
1f080 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1f090 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1f0a0 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1f0b0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
1f0c0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1f0d0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1f0e0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1f0f0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1f100 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1f110 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1f120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1f130 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1f140 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1f150 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1f160 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1f170 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1f180 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1f190 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1f1a0 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1f1b0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1f1c0 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
1f1d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
1f1e0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1f1f0 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
1f200 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1f210 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1f220 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1f230 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1f240 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1f250 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1f260 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1f270 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1f280 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1f290 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f2a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1f2b0 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1f2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1f2d0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1f2e0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1f2f0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1f300 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
1f310 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1f320 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
1f330 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
1f340 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1f350 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1f360 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1f370 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1f380 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1f390 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1f3a0 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1f3b0 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1f3c0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f3d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1f3e0 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1f3f0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f410 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1f420 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1f430 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1f440 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1f450 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1f460 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1f470 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1f480 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1f490 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
1f4a0 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
1f4b0 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
1f4c0 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
1f4d0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
1f4e0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
1f4f0 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
1f500 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
1f510 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1f520 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
1f530 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
1f540 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
1f550 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
1f560 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
1f570 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
1f580 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
1f590 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
1f5a0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1f5b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1f5c0 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1f5d0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f5e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1f600 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1f610 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1f620 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1f630 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f640 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1f650 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
1f660 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
1f670 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f680 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f690 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
1f6a0 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
1f6b0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f6c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f6e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f6f0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f700 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
1f710 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
1f720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f730 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f740 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1f750 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f760 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1f770 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1f780 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1f790 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f7a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1f7b0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1f7c0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1f7d0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1f7e0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f7f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1f800 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f810 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f820 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1f830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1f840 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1f850 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1f860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f870 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1f880 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f890 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f8a0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1f8b0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f8c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f8d0 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1f8e0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1f8f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1f900 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1f910 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1f920 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1f930 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f940 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1f950 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1f960 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1f970 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1f980 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1f990 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1f9a0 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1f9b0 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1f9c0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1f9d0 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1f9e0 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1f9f0 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1fa00 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1fa10 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1fa20 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1fa30 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1fa40 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1fa50 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1fa60 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1fa70 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1fa80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fa90 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1faa0 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1fab0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1fac0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1fad0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1fae0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1faf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1fb00 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1fb10 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1fb20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1fb30 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1fb40 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1fb50 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1fb60 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1fb70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fb80 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRhs->flags & M
1fb90 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70  EM_Zero)==0 || p
1fba0 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Rhs->n==0 );.   
1fbb0 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1fbc0 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1fbd0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1fbe0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1fbf0 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1fc00 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1fc10 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
1fc20 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1fc30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1fc40 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1fc50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
1fc60 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1fc70 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1fc80 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1fc90 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
1fca0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1fcb0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1fcc0 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
1fcd0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1fce0 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
1fcf0 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
1fd00 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1fd10 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1fd20 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1fd30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1fd40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1fd70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1fd80 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1fd90 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1fda0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c         if( !isAl
1fdb0 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61  lZero((const cha
1fdc0 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53  r*)&aKey1[d1],nS
1fdd0 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tr) ){.         
1fde0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
1fdf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fe00 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74          rc = nSt
1fe10 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72  r - pRhs->u.nZer
1fe20 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
1fe30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fe40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1fe50 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
1fe60 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1fe70 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1fe80 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1fe90 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1fea0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1feb0 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1fec0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
1fed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fee0 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
1fef0 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
1ff00 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1ff10 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1ff20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
1ff30 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
1ff40 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
1ff50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  ){.      if( pKe
1ff60 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1ff70 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1ff80 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
1ff90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1ffa0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1ffb0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1ffc0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
1ffd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ffe0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1fff0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
20000 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
20010 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20020 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
20030 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
20040 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
20050 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
20060 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
20070 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
20080 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
20090 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
200a0 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
200b0 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
200c0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
200d0 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
200e0 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
200f0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
20100 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
20110 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
20120 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
20130 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
20140 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
20150 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
20160 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
20170 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
20180 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
20190 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
201a0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
201b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
201c0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
201d0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
201e0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
201f0 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
20200 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
20210 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
20220 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
20230 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
20240 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
20250 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
20260 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
20270 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
20280 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
20290 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
202a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
202b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
202c0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
202d0 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  c) .       || pK
202e0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
202f0 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
20300 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
20310 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   1;.  return pPK
20320 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
20330 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
20340 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20350 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
20360 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
20370 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
20380 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
20390 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
203a0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
203b0 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
203c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
203d0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
203e0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
203f0 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
20400 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20410 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
20420 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
20430 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20440 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
20450 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
20460 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
20470 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
20480 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
20490 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
204a0 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
204b0 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
204c0 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
204d0 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
204e0 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
204f0 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
20500 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
20510 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
20520 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
20530 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
20540 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
20550 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
20560 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
20570 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
20580 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
20590 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
205a0 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
205b0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
205c0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
205d0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
205e0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
205f0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
20600 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
20610 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
20620 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
20630 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
20640 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
20650 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
20660 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
20670 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
20680 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
20690 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20  64 x;.  i64 v;. 
206a0 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62   i64 lhs;..  vdb
206b0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
206c0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
206d0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
206e0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
206f0 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
20700 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
20710 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
20720 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
20730 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
20740 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
20750 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
20760 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
20770 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20790 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
207a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
207b0 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
207c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
207d0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
207e0 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
207f0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20800 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20810 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20820 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
20830 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
20840 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20850 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
20860 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20870 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20880 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20890 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
208a0 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
208b0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
208c0 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
208d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
208e0 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
208f0 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
20900 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20910 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20920 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20930 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
20940 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20950 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20960 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
20970 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
20980 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
20990 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
209a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
209b0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
209c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
209d0 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
209e0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
209f0 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
20a00 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20a10 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
20a20 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
20a30 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
20a40 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
20a50 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
20a60 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20a70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20a80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
20a90 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
20aa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20ab0 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
20ac0 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
20ad0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
20ae0 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
20af0 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
20b00 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
20b10 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
20b20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
20b30 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
20b40 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
20b50 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
20b60 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
20b70 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
20b80 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
20b90 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
20ba0 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
20bb0 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
20bc0 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
20bd0 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
20be0 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
20bf0 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
20c00 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
20c10 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
20c20 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
20c30 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
20c40 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
20c50 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
20c60 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
20c70 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
20c80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20c90 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20ca0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20cb0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20  ey1, pPKey2);.. 
20cc0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
20cd0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20ce0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20cf0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
20d00 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20  pPKey2);.  }..  
20d10 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  v = pPKey2->aMem
20d20 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76  [0].u.i;.  if( v
20d30 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
20d40 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
20d50 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
20d60 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
20d70 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
20d80 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
20d90 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
20da0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
20db0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
20dc0 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
20dd0 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
20de0 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
20df0 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
20e00 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20e10 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
20e20 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20e30 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
20e40 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
20e50 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
20e60 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
20e70 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
20e80 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
20e90 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
20ea0 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
20eb0 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
20ec0 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
20ed0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
20ee0 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79  lt_rc;.    pPKey
20ef0 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
20f00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
20f10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20f20 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20f30 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
20f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
20f50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20f60 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
20f70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
20f80 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
20f90 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
20fa0 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
20fb0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
20fc0 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
20fd0 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
20fe0 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
20ff0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
21000 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
21010 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
21020 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
21030 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
21040 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
21050 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
21060 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
21070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
21080 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21090 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
210a0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
210b0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
210c0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
210d0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
210e0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
210f0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
21100 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
21110 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
21120 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
21130 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
21140 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
21150 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26  >aMem[0].flags &
21160 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64   MEM_Str );.  vd
21170 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
21180 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
21190 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
211a0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
211b0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
211c0 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
211d0 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
211e0 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
211f0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21200 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
21210 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
21220 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
21230 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
21240 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
21250 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
21260 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
21270 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
21280 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
21290 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
212a0 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
212b0 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
212c0 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
212d0 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
212e0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
212f0 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
21300 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
21310 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
21320 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
21330 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
21340 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
21350 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
21360 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
21370 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
21380 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21390 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
213a0 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
213b0 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
213c0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
213d0 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
213e0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
213f0 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
21400 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
21410 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
21420 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
21430 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
21440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
21450 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
21460 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
21470 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
21480 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
21490 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
214a0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
214b0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
214c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
214d0 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
214e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
214f0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
21500 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
21510 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
21520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21530 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21540 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
21550 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
21560 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
21570 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
21580 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
21590 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
215a0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
215b0 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
215c0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
215d0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
215e0 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
215f0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
21600 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
21610 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
21620 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
21630 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
21640 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
21650 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
21660 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21670 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
21680 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
21690 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
216a0 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
216b0 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
216c0 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
216d0 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
216e0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
216f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
21700 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
21710 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
21720 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
21730 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
21740 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
21750 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
21760 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
21770 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
21780 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
21790 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
217a0 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
217b0 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
217c0 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
217d0 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
217e0 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
217f0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
21800 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
21810 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
21820 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
21830 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
21840 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
21850 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
21860 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
21870 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
21880 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
21890 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
218a0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
218b0 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
218c0 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
218d0 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
218e0 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
218f0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
21900 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
21910 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
21920 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
21930 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
21940 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
21950 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
21960 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
21970 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
21980 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
21990 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
219a0 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
219b0 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
219c0 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
219d0 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
219e0 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
219f0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
21a00 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
21a10 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
21a20 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
21a30 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
21a40 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
21a50 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
21a60 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
21a70 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
21a80 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
21a90 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
21aa0 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
21ab0 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
21ac0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
21ad0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
21ae0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
21af0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
21b00 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
21b10 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
21b20 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
21b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21b40 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
21b50 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
21b60 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
21b70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
21b80 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21b90 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
21ba0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21bb0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
21bc0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21bd0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21be0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
21bf0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
21c00 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
21c10 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
21c20 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
21c30 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
21c40 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
21c50 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
21c60 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
21c70 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
21c80 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21c90 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21ca0 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
21cb0 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
21cc0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
21cd0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
21ce0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
21cf0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
21d00 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
21d10 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
21d20 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
21d30 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
21d40 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
21d50 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
21d60 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
21d70 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
21d80 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
21d90 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
21da0 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
21db0 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
21dc0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
21dd0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
21de0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
21df0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
21e00 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
21e10 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
21e20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
21e30 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
21e40 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
21e50 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
21e60 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
21e70 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
21e80 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
21e90 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
21ea0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
21eb0 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
21ec0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
21ed0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
21ee0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
21ef0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
21f00 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
21f10 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
21f20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
21f30 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
21f40 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
21f50 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
21f60 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
21f70 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
21f80 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
21f90 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
21fa0 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
21fb0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
21fc0 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
21fd0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
21fe0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
21ff0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
22000 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
22010 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
22020 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
22030 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
22040 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
22050 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
22060 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    nCellKey = sql
22070 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
22080 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73  Size(pCur);.  as
22090 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
220a0 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
220b0 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
220c0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
220d0 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
220e0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
220f0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
22100 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
22110 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
22120 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
22130 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
22140 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
22150 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  Key, &m);.  if( 
22160 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
22170 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
22180 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
22190 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
221a0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
221b0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
221c0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
221d0 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
221e0 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
221f0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
22200 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
22210 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
22220 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
22230 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
22240 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
22250 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
22260 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
22270 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
22280 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
22290 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
222a0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
222b0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
222c0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
222d0 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
222e0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
222f0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
22300 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
22310 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22320 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
22330 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
22340 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22350 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
22360 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22370 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
22380 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22390 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
223a0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
223b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
223c0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
223d0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
223e0 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
223f0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
22400 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
22410 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
22420 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
22430 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
22440 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
22450 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
22460 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
22470 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
22480 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
22490 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
224a0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
224b0 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
224c0 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
224d0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
224e0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
224f0 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
22500 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
22510 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
22520 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
22530 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
22540 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
22550 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
22560 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
22570 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
22580 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
22590 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
225a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
225b0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
225c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
225d0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
225e0 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
225f0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
22600 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
22610 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
22620 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
22630 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
22640 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
22650 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
22660 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
22670 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22680 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22690 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
226a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
226b0 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
226c0 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
226d0 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
226e0 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
226f0 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
22700 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
22710 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
22720 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
22730 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
22740 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
22750 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
22760 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
22770 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
22780 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
22790 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
227a0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
227b0 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
227c0 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
227d0 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
227e0 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
227f0 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
22800 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
22810 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
22820 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
22830 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
22840 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
22850 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
22860 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
22870 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
22880 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
22890 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
228a0 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
228b0 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
228c0 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
228d0 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
228e0 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
228f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
22900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22910 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22920 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
22930 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
22940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22950 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
22960 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
22970 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22980 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
22990 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
229a0 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
229b0 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
229e0 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
229f0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
22a00 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
22a10 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
22a20 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
22a30 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
22a40 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
22a50 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
22a60 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
22a70 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
22a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22a90 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
22aa0 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
22ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
22ac0 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
22ad0 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
22ae0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
22af0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
22b00 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
22b10 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
22b20 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
22b30 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
22b40 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
22b50 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
22b60 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
22b70 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
22b80 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
22b90 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
22ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22bb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22bc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22bd0 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
22be0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22bf0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
22c00 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
22c10 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
22c20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
22c30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
22c40 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
22c50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
22c60 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
22c70 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
22c80 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22c90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22ca0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
22cb0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
22cc0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
22cd0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
22ce0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
22cf0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
22d00 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
22d10 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
22d20 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
22d30 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
22d40 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
22d50 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
22d60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22d70 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
22d80 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
22d90 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
22da0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
22db0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
22dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
22dd0 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
22de0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
22df0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
22e00 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
22e10 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
22e20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
22e30 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
22e40 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
22e50 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
22e60 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
22e70 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
22e80 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
22e90 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
22ea0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
22eb0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
22ec0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
22ed0 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
22ee0 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
22ef0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
22f00 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
22f10 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
22f20 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
22f30 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
22f40 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
22f50 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
22f60 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
22f70 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
22f80 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
22f90 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
22fa0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
22fb0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
22fc0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
22fd0 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
22fe0 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
22ff0 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
23000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23010 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
23020 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
23030 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
23040 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
23050 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
23060 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
23070 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
23080 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23090 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
230a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
230b0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
230c0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
230d0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
230e0 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
230f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
23100 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c  QLITE_PREPARE fl
23110 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a  ags for a Vdbe..
23120 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  */.u8 sqlite3Vdb
23130 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64  ePrepareFlags(Vd
23140 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
23150 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d   v->prepFlags;.}
23160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23170 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
23180 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
23190 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
231a0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
231b0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
231c0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
231d0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
231e0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
231f0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
23200 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
23210 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
23220 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
23230 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
23240 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
23250 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
23260 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
23270 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
23280 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
23290 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
232a0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
232b0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
232c0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
232d0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
232e0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
232f0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
23300 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
23310 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
23320 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
23330 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
23340 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
23350 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
23360 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
23370 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
23380 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
23390 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
233a0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
233b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
233c0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
233d0 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
233e0 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
233f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23400 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
23410 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
23420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
23430 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
23440 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
23450 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
23460 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
23470 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
23480 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
23490 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
234a0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
234b0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
234c0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
234d0 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
234e0 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
234f0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
23500 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
23510 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
23520 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
23530 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
23540 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
23550 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
23560 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
23570 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
23580 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64  .  assert( (v->d
23590 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
235a0 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
235b0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d   );.  if( iVar>=
235c0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
235d0 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30  mask |= 0x800000
235e0 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
235f0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
23600 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
23610 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
23620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23630 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
23640 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
23650 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
23660 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
23670 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
23680 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
23690 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
236a0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
236b0 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
236c0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
236d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
236e0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
236f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
23700 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23710 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
23720 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
23730 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
23740 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45  .  if( pVtab->zE
23750 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c  rrMsg ){.    sql
23760 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
23770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
23780 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
23790 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
237a0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
237b0 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d  trDup(db, pVtab-
237c0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73  >zErrMsg);.    s
237d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
237e0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
237f0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
23800 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
23810 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23820 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
23830 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23840 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
23850 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  _HOOK../*.** If 
23860 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23870 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
23880 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c   release any all
23890 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
238a0 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65  ted .** with the
238b0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e   memory cells in
238c0 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61   the p->aMem[] a
238d0 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20  rray. Also free 
238e0 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  the UnpackedReco
238f0 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
23900 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71  itself, using sq
23910 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
23920 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23930 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 72  on is used to fr
23940 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ee UnpackedRecor
23950 64 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c  d structures all
23960 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
23970 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72   vdbeUnpackRecor
23980 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75  d() function fou
23990 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e  nd in vdbeapi.c.
239a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
239b0 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
239c0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
239d0 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b  t nField, Unpack
239e0 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
239f0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
23a00 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
23a10 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b   i<nField; i++){
23a20 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
23a30 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a   = &p->aMem[i];.
23a40 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
23a50 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
23a60 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
23a70 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
23a80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
23a90 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23  (db, p);.  }.}.#
23aa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
23ab0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
23ac0 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66  _HOOK */..#ifdef
23ad0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
23ae0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
23af0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70  .** Invoke the p
23b00 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20  re-update hook. 
23b10 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50  If this is an UP
23b20 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70  DATE or DELETE p
23b30 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a  re-update call,.
23b40 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70  ** then cursor p
23b50 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23b60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  ond argument sho
23b70 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  uld point to the
23b80 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f   row about.** to
23b90 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65   be update or de
23ba0 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70  leted. If the ap
23bb0 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
23bc0 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
23bd0 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20  e_old(),.** the 
23be0 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77  required value w
23bf0 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
23c00 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
23c10 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  sor points to..*
23c20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
23c30 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28  bePreUpdateHook(
23c40 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75     /* Vdbe pre-u
23c70 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e  pdate hook is in
23c80 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64  voked by */.  Vd
23c90 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  beCursor *pCsr, 
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cb0 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20   Cursor to grab 
23cc0 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f  old.* values fro
23cd0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  m */.  int op,  
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
23d00 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20  _INSERT, UPDATE 
23d10 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63  or DELETE */.  c
23d20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d40 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
23d50 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64       /* Modified
23d80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20   table */.  i64 
23d90 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20  iKey1,          
23da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23db0 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65  nitial key value
23dc0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20   */.  int iReg  
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23de0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
23df0 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f  r for new.* reco
23e00 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  rd */.){.  sqlit
23e10 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a  e3 *db = v->db;.
23e20 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50    i64 iKey2;.  P
23e30 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61  reUpdate preupda
23e40 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
23e50 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a   *zTbl = pTab->z
23e60 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63  Name;.  static c
23e70 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74  onst u8 fakeSort
23e80 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73  Order = 0;..  as
23e90 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70  sert( db->pPreUp
23ea0 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  date==0 );.  mem
23eb0 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20  set(&preupdate, 
23ec0 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64  0, sizeof(PreUpd
23ed0 61 74 65 29 29 3b 0a 20 20 69 66 28 20 48 61 73  ate));.  if( Has
23ee0 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30 20 29  Rowid(pTab)==0 )
23ef0 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d 20 69 4b  {.    iKey1 = iK
23f00 65 79 32 20 3d 20 30 3b 0a 20 20 20 20 70 72 65  ey2 = 0;.    pre
23f10 75 70 64 61 74 65 2e 70 50 6b 20 3d 20 73 71 6c  update.pPk = sql
23f20 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
23f30 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c  dex(pTab);.  }el
23f40 73 65 7b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  se{.    if( op==
23f50 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
23f60 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 76  .      iKey2 = v
23f70 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69  ->aMem[iReg].u.i
23f80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23f90 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31     iKey2 = iKey1
23fa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
23fb0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69  ssert( pCsr->nFi
23fc0 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  eld==pTab->nCol 
23fd0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72  .       || (pCsr
23fe0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
23ff0 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51  nCol+1 && op==SQ
24000 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69  LITE_DELETE && i
24010 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20  Reg==-1).  );.. 
24020 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76   preupdate.v = v
24030 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43  ;.  preupdate.pC
24040 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65  sr = pCsr;.  pre
24050 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a  update.op = op;.
24060 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77    preupdate.iNew
24070 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72  Reg = iReg;.  pr
24080 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
24090 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70  db = db;.  preup
240a0 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63  date.keyinfo.enc
240b0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72   = ENC(db);.  pr
240c0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
240d0 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e  nField = pTab->n
240e0 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Col;.  preupdate
240f0 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72  .keyinfo.aSortOr
24100 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65  der = (u8*)&fake
24110 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65  SortOrder;.  pre
24120 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69  update.iKey1 = i
24130 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74  Key1;.  preupdat
24140 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b  e.iKey2 = iKey2;
24150 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 54 61  .  preupdate.pTa
24160 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d  b = pTab;..  db-
24170 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70  >pPreUpdate = &p
24180 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e  reupdate;.  db->
24190 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61  xPreUpdateCallba
241a0 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74  ck(db->pPreUpdat
241b0 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44  eArg, db, op, zD
241c0 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20  b, zTbl, iKey1, 
241d0 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50  iKey2);.  db->pP
241e0 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  reUpdate = 0;.  
241f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24200 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63  , preupdate.aRec
24210 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65  ord);.  vdbeFree
24220 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65  Unpacked(db, pre
24230 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
24240 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
24250 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
24260 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
24270 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
24280 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31  keyinfo.nField+1
24290 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77  , preupdate.pNew
242a0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28  Unpacked);.  if(
242b0 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20   preupdate.aNew 
242c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
242d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
242e0 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b  r->nField; i++){
242f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24300 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72  beMemRelease(&pr
24310 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29  eupdate.aNew[i])
24320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24330 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
24340 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b  preupdate.aNew);
24350 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
24360 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
24370 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
24380 0a                                               .