/ Hex Artifact Content
Login

Artifact 518d1cf6728ecb591390541c58b14902e8d61735ef574426b9971624c54d2c4b:


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 3b 0a 20 20 20  SQLITE_FULL;.   
14050 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
14060 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
14070 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
14080 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
14090 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
140a0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
140b0 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
140c0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
140d0 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
140e0 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
140f0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
14100 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
14110 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
14120 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
14130 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
14140 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
14150 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
14160 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
14170 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
14180 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
14190 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
141a0 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
141b0 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
141c0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
141d0 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
141e0 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
141f0 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
14200 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
14210 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
14220 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
14230 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
14240 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
14250 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
14260 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
14270 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
14280 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
14290 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
142a0 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
142b0 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
142c0 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
142d0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
142e0 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
142f0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
14300 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
14310 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
14320 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
14330 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
14340 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
14350 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
14360 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
14370 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
14380 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
14390 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
143a0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
143b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
143c0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
143d0 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
143e0 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
143f0 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
14400 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
14410 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
14420 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
14430 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
14440 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
14450 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
14460 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14470 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
14480 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
14490 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
144a0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
144b0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
144c0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
144d0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
144e0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
144f0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
14500 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14510 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
14520 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  r immediate fore
14530 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f  ign key violatio
14540 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ns. */.    if( p
14550 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14560 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14570 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30  VdbeCheckFk(p, 0
14580 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
14590 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
145a0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
145b0 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
145c0 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72  e only active wr
145d0 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c  iter .    ** VM,
145e0 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68   then we do eith
145f0 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
14600 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
14610 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
14620 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
14630 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
14640 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
14650 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
14660 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
14670 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
14680 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
14690 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
146a0 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
146b0 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
146c0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
146d0 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65      && db->nVdbe
146e0 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f  Write==(p->readO
146f0 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
14700 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14710 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
14720 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
14730 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
14740 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
14750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14760 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
14770 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
14780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14790 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
147a0 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
147b0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
147c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
147d0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
147e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
147f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
14800 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
14810 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
14820 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
14830 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
14840 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
14850 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
14860 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
14870 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
14880 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
14890 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
148a0 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
148b0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
148c0 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
148d0 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
148e0 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
148f0 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
14900 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
14910 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
14920 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
14930 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
14940 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
14950 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
14960 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
14970 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
14980 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
14990 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
149a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149b0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
149c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
149d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
149e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
149f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14a00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
14a10 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
14a20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14a30 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
14a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
14a50 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14a60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14a70 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
14a80 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  redCons = 0;.   
14a90 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
14aa0 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
14ab0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66  .          db->f
14ac0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
14ad0 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20  DeferFKs;.      
14ae0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
14af0 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
14b00 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
14b10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14b20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14b30 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14b40 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
14b50 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
14b70 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
14b80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14b90 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
14ba0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
14bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14bc0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
14bd0 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
14be0 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
14bf0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
14c00 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
14c10 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
14c20 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
14c30 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
14c40 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
14c50 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
14c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14c70 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14c80 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14c90 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
14ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14cb0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
14cc0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
14cd0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
14ce0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
14cf0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
14d00 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
14d10 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
14d20 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
14d30 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
14d40 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
14d50 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
14d60 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
14d70 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
14d80 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
14d90 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
14da0 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
14db0 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
14dc0 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
14dd0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
14de0 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
14df0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
14e00 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
14e10 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
14e20 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
14e30 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
14e40 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
14e50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
14e60 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
14e70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
14e80 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
14e90 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
14ea0 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
14eb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14ec0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14ed0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
14ee0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
14ef0 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
14f00 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
14f10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14f20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14f30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
14f40 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
14f50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
14f60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14f70 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14f80 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
14f90 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
14fa0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14fb0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14fc0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14fd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14fe0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
15000 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
15010 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
15020 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
15030 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
15040 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
15050 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
15060 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
15070 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
15080 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
15090 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
150a0 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
150b0 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
150c0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
150d0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
150e0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
150f0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
15100 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
15110 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
15120 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
15130 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
15140 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
15150 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
15160 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
15170 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
15180 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
15190 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
151a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
151b0 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
151c0 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
151d0 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
151e0 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
151f0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
15200 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
15210 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
15220 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
15230 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
15240 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
15250 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
15260 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
15270 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
15280 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
15290 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
152a0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
152b0 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
152c0 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
152d0 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
152e0 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
152f0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
15300 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
15310 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
15320 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b);.  if( db->ma
15330 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
15340 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
15350 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
15360 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
15370 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
15380 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
15390 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
153a0 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
153b0 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
153c0 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
153d0 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
153e0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
153f0 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
15400 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
15410 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
15420 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
15430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
15440 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
15450 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
15460 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
15470 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
15480 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
15490 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
154a0 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
154b0 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
154c0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
154d0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
154e0 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
154f0 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
15500 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
15510 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
15520 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
15530 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
15540 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
15550 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
15560 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
15570 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
15580 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
15590 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
155a0 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
155b0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
155c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
155d0 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
155e0 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
155f0 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
15600 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
15610 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
15620 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
15630 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
15640 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
15650 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
15660 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
15670 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
15680 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
15690 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
156a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
156b0 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
156c0 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
156d0 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
156e0 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
156f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15700 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
15710 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
15720 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
15730 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15740 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
15750 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
15760 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
15770 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
15780 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c  alloc++;.    sql
15790 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
157a0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
157b0 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
157c0 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
157d0 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
157e0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
157f0 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
15800 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
15810 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
15820 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
15830 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15840 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15850 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
15860 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69  loc--;.  }else i
15870 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20  f( db->pErr ){. 
15880 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
15890 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29  etNull(db->pErr)
158a0 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43  ;.  }.  db->errC
158b0 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  ode = rc;.  retu
158c0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
158d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
158e0 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
158f0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
15900 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
15910 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
15920 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
15930 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
15940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15950 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
15960 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
15970 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
15980 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
15990 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
159a0 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
159b0 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
159c0 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
159d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
159e0 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
159f0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
15a00 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
15a10 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
15a20 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
15a30 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
15a40 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
15a50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15a60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
15a70 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
15a80 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
15a90 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
15aa0 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
15ab0 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
15ac0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
15ad0 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
15ae0 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
15af0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
15b00 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
15b10 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
15b20 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
15b30 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
15b40 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
15b50 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
15b60 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
15b70 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
15b80 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
15b90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15ba0 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
15bb0 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
15bc0 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
15bd0 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
15be0 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
15bf0 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
15c00 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
15c10 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
15c20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
15c30 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
15c40 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
15c50 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
15c60 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
15c70 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
15c80 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
15c90 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
15ca0 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
15cb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
15cc0 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
15cd0 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
15ce0 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
15cf0 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
15d00 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
15d10 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
15d20 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
15d30 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
15d40 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
15d50 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
15d60 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
15d70 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
15d80 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
15d90 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
15da0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
15db0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
15dc0 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
15dd0 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
15de0 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
15df0 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
15e00 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
15e10 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
15e20 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
15e30 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
15e40 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
15e50 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
15e60 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
15e70 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
15e80 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
15e90 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
15ea0 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b  ){.    vdbeInvok
15eb0 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20  eSqllog(p);.    
15ec0 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
15ed0 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  ferError(p);.   
15ee0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15ef0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
15f00 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15f10 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
15f20 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
15f30 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
15f40 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
15f50 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
15f60 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
15f70 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
15f80 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
15f90 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
15fa0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
15fb0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
15fc0 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
15fd0 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
15fe0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
15ff0 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
16000 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
16010 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
16020 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
16030 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
16040 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
16050 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
16060 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
16070 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16080 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
16090 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
160a0 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
160b0 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
160c0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
160d0 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
160e0 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
160f0 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
16100 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
16110 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
16120 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
16130 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
16140 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
16150 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
16160 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
16170 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
16180 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
16190 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
161a0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
161b0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
161c0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
161d0 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
161e0 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
161f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16200 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
16210 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n");.      if( p
16220 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ->zSql ){.      
16230 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30    char c, pc = 0
16240 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
16250 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
16260 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
16270 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29  (c = p->zSql[i])
16280 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
16290 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e       if( pc=='\n
162a0 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
162b0 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
162c0 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b     putc(c, out);
162d0 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
162e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
162f0 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e       if( pc!='\n
16300 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
16310 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
16320 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
16330 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
16340 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72         char zHdr
16350 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  [100];.        s
16360 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
16370 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48  sizeof(zHdr), zH
16380 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20  dr, "%6u %12llu 
16390 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20  %8llu ",.       
163a0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
163b0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
163c0 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
163d0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
163e0 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
163f0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
16400 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
16410 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
16420 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
16430 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20  "%s", zHdr);.   
16440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16450 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
16460 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
16470 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
16480 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
16490 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
164a0 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
164b0 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e  _RESET;.  return
164c0 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
164d0 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
164e0 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
164f0 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
16500 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
16510 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
16520 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
16530 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
16540 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
16550 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
16560 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
16570 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
16580 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
16590 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
165a0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
165b0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
165c0 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
165d0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
165e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
165f0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
16600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
16610 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
16620 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
16630 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
16640 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
16650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
16660 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73  parameter iOp is
16670 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16680 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
16690 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a   destructor for.
166a0 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79  ** all auxiliary
166b0 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
166c0 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
166d0 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
166e0 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   as.** the first
166f0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
16700 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67   Or, if iOp is g
16710 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
16720 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
16730 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  en the destructo
16740 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76  r is.** only inv
16750 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61  oked for those a
16760 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
16770 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62  inters created b
16780 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66  y the user .** f
16790 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20  unction invoked 
167a0 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69  by the OP_Functi
167b0 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73  on opcode at ins
167c0 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20  truction iOp of 
167d0 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e  .** VM pVdbe, an
167e0 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a  d only then if:.
167f0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  **.**    * the a
16800 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69  ssociated functi
16810 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  on parameter is 
16820 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65  the 32nd or late
16830 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20  r (counting.**  
16840 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f      from left to
16850 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a   right), or.**.*
16860 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65  *    * the corre
16870 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
16880 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73  argument mask is
16890 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68   clear (where th
168a0 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20  e first.**      
168b0 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
168c0 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  er corresponds t
168d0 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a  o bit 0 etc.)..*
168e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
168f0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
16900 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78  sqlite3 *db, Aux
16910 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69  Data **pp, int i
16920 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  Op, int mask){. 
16930 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
16940 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
16950 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
16960 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
16970 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69  (pAux->iAuxOp==i
16980 4f 70 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  Op.          && 
16990 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30  pAux->iAuxArg>=0
169a0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
169b0 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 33 31 20  Aux->iAuxArg>31 
169c0 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
169d0 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 75 78  BIT32(pAux->iAux
169e0 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20  Arg)))).    ){. 
169f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16a00 41 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31  Aux->iAuxArg==31
16a10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   );.      if( pA
16a20 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 20 29  ux->xDeleteAux )
16a30 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
16a40 78 44 65 6c 65 74 65 41 75 78 28 70 41 75 78 2d  xDeleteAux(pAux-
16a50 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
16a60 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
16a70 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20  ->pNextAux;.    
16a80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16a90 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d  db, pAux);.    }
16aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20  else{.      pp= 
16ab0 26 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b  &pAux->pNextAux;
16ac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16ad0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
16ae0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
16af0 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
16b00 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
16b10 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
16b20 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
16b30 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
16b40 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
16b50 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
16b60 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
16b70 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
16b80 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
16b90 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
16ba0 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
16bb0 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
16bc0 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
16bd0 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
16be0 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
16bf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
16c00 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
16c10 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
16c20 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
16c30 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
16c40 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
16c50 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
16c60 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61  Sub, *pNext;.  a
16c70 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
16c80 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  || p->db==db );.
16c90 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
16ca0 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
16cb0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
16cc0 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
16cd0 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
16ce0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
16cf0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
16d00 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
16d10 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
16d20 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
16d30 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
16d40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16d50 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69  , pSub);.  }.  i
16d60 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
16d70 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
16d80 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
16d90 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
16da0 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  nVar);.    sqlit
16db0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16dc0 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pVList);.    sql
16dd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16de0 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  ->pFree);.  }.  
16df0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16e00 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
16e10 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
16e20 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
16e30 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16e40 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
16e50 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ql);.#ifdef SQLI
16e60 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
16e70 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20  CANSTATUS.  {.  
16e80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
16e90 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e  (i=0; i<p->nScan
16ea0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
16eb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16ec0 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
16ed0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
16ee0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16ef0 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23  p->aScan);.  }.#
16f00 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
16f10 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
16f20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
16f30 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
16f40 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
16f50 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
16f60 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
16f70 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
16f80 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
16f90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16fa0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
16fb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16fc0 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
16fd0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
16fe0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
16ff0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
17000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
17010 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
17020 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
17030 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
17040 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
17050 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
17060 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
17070 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
17080 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
17090 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
170a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
170b0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
170c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
170d0 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
170e0 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
170f0 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
17100 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
17110 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
17120 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
17130 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
17140 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
17150 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
17160 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
17170 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
17180 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
17190 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
171a0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
171b0 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
171c0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
171d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
171e0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
171f0 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
17200 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
17210 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
17220 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
17230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
17240 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
17250 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
17260 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
17270 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
17280 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
17290 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
172a0 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
172b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
172c0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
172d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
172e0 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
172f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
17300 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
17310 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
17320 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
17330 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
17340 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
17350 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
17360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17370 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
17380 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
17390 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
173a0 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
173b0 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
173c0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
173d0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
173e0 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
173f0 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
17400 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
17410 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
17420 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
17430 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
17440 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
17450 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
17460 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
17470 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
17480 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
17490 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
174a0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
174b0 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
174c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
174d0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
174e0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
174f0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
17500 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
17510 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
17520 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
17530 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
17540 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
17550 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
17560 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17570 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
17580 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
17590 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
175a0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
175b0 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
175c0 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
175d0 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
175e0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
175f0 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
17600 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
17610 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
17620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17630 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
17640 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
17650 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
17660 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
17670 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
17680 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
17690 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
176a0 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
176b0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
176c0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
176d0 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
176e0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
176f0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
17700 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
17710 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17720 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
17730 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
17740 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
17750 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
17760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17770 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17780 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
17790 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
177a0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
177b0 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
177c0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
177d0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
177e0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
177f0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
17800 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
17810 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
17820 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
17830 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
17840 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
17850 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
17860 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
17870 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
17880 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
17890 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
178a0 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
178b0 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
178c0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
178d0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
178e0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
178f0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
17900 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
17910 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
17920 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
17930 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
17940 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
17950 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
17960 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
17970 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
17980 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
17990 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
179a0 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
179b0 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
179c0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
179d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
179e0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
179f0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70  (VdbeCursor **pp
17a00 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20  , int *piCol){. 
17a10 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d   VdbeCursor *p =
17a20 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65   *pp;.  if( p->e
17a30 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
17a40 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66  _BTREE ){.    if
17a50 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
17a60 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eto ){.      int
17a70 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28   iMap;.      if(
17a80 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28   p->aAltMap && (
17a90 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61  iMap = p->aAltMa
17aa0 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29  p[1+*piCol])>0 )
17ab0 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
17ac0 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20  p->pAltCursor;. 
17ad0 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
17ae0 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20  iMap - 1;.      
17af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b00 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
17b10 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
17b20 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
17b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17b40 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17b50 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
17b60 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
17b70 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
17b80 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
17b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17bb0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
17bc0 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
17bd0 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
17be0 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
17bf0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17c00 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
17c10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17c20 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
17c30 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
17c40 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17c50 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
17c60 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
17c70 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
17c80 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
17c90 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
17ca0 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
17cb0 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
17cc0 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
17cd0 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
17ce0 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
17cf0 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
17d00 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
17d10 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
17d20 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
17d30 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
17d40 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
17d50 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
17d60 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
17d70 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
17d80 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
17d90 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
17da0 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
17db0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
17dc0 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
17dd0 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
17de0 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
17df0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
17e00 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
17e10 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
17e20 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
17e30 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
17e40 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
17e50 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
17e60 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
17e70 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
17e80 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65  ta blob separate
17e90 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
17ea0 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
17eb0 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
17ec0 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
17ed0 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
17ee0 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
17ef0 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
17f00 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
17f10 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
17f20 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
17f30 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
17f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
17f50 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17f60 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17f70 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
17f80 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
17f90 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
17fa0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17fb0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
17fe0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17ff0 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
18010 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
18020 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
18030 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
18040 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
18050 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
18060 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
18090 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
180a0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
180b0 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
180c0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
180d0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
180e0 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
180f0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
18100 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
18110 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
18120 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
18130 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
18140 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
18150 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
18160 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
18170 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
18180 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
18190 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
181c0 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
181d0 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
181e0 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
181f0 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
18200 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
18210 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
18220 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
18230 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
18240 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
18250 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
18260 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
18270 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
18280 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
18290 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
182a0 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
182b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
182c0 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
182d0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
182e0 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
182f0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
18300 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
18310 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
18320 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b  mat, u32 *pLen){
18330 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
18340 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33  Mem->flags;.  u3
18350 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 n;..  assert( 
18360 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28  pLen!=0 );.  if(
18370 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
18380 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30  ){.    *pLen = 0
18390 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
183a0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
183b0 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
183c0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
183d0 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
183e0 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
183f0 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
18400 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
18410 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
18420 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
18430 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
18440 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
18450 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20   i<0 ){.      u 
18460 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = ~i;.    }else{
18470 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
18480 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
18490 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  27 ){.      if( 
184a0 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
184b0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
184c0 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b        *pLen = 0;
184d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
184e0 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20  8+(u32)u;.      
184f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
18500 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  pLen = 1;.      
18510 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18530 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70  ( u<=32767 ){ *p
18540 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20  Len = 2; return 
18550 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  2; }.    if( u<=
18560 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e  8388607 ){ *pLen
18570 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20   = 3; return 3; 
18580 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  }.    if( u<=214
18590 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e  7483647 ){ *pLen
185a0 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20   = 4; return 4; 
185b0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  }.    if( u<=MAX
185c0 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20  _6BYTE ){ *pLen 
185d0 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d  = 6; return 5; }
185e0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
185f0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
18600 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
18610 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Real ){.    *p
18620 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
18630 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
18640 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
18650 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
18660 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
18670 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73  M_Blob) );.  ass
18680 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20  ert( pMem->n>=0 
18690 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d  );.  n = (u32)pM
186a0 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61  em->n;.  if( fla
186b0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
186c0 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e  .    n += pMem->
186d0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a  u.nZero;.  }.  *
186e0 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75  pLen = n;.  retu
186f0 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
18700 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
18710 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
18720 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73   The sizes for s
18730 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73  erial types less
18740 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61   than 128.*/.sta
18750 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c  tic const u8 sql
18760 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
18770 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  es[] = {.       
18780 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20   /*  0   1   2  
18790 20 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20   3   4   5   6  
187a0 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20   7   8   9 */   
187b0 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20  ./*   0 */   0, 
187c0 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
187d0 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20   6,  8,  8,  0, 
187e0 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20   0,./*  10 */   
187f0 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
18800 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20  1,  1,  2,  2,  
18810 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f  3,  3,./*  20 */
18820 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35     4,  4,  5,  5
18830 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37  ,  6,  6,  7,  7
18840 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30  ,  8,  8,./*  30
18850 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c   */   9,  9, 10,
18860 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c   10, 11, 11, 12,
18870 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20   12, 13, 13,./* 
18880 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20   40 */  14, 14, 
18890 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20  15, 15, 16, 16, 
188a0 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a  17, 17, 18, 18,.
188b0 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31  /*  50 */  19, 1
188c0 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32  9, 20, 20, 21, 2
188d0 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32  1, 22, 22, 23, 2
188e0 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34  3,./*  60 */  24
188f0 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36  , 24, 25, 25, 26
18900 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38  , 26, 27, 27, 28
18910 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20  , 28,./*  70 */ 
18920 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c   29, 29, 30, 30,
18930 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c   31, 31, 32, 32,
18940 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20   33, 33,./*  80 
18950 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20  */  34, 34, 35, 
18960 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20  35, 36, 36, 37, 
18970 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20  37, 38, 38,./*  
18980 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34  90 */  39, 39, 4
18990 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34  0, 40, 41, 41, 4
189a0 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f  2, 42, 43, 43,./
189b0 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34  * 100 */  44, 44
189c0 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36  , 45, 45, 46, 46
189d0 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38  , 47, 47, 48, 48
189e0 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c  ,./* 110 */  49,
189f0 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c   49, 50, 50, 51,
18a00 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c   51, 52, 52, 53,
18a10 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20   53,./* 120 */  
18a20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20  54, 54, 55, 55, 
18a30 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d  56, 56, 57, 57.}
18a40 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
18a50 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
18a60 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
18a70 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
18a80 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
18a90 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
18aa0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
18ab0 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
18ac0 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
18ad0 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20  _type>=128 ){.  
18ae0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
18af0 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
18b00 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
18b10 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
18b20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
18b30 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
18b40 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
18b50 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70  pe]==(serial_typ
18b60 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20  e - 12)/2 );.   
18b70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
18b80 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18b90 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
18ba0 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65  }.u8 sqlite3Vdbe
18bb0 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70  OneByteSerialTyp
18bc0 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74  eLen(u8 serial_t
18bd0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
18be0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20  serial_type<128 
18bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
18c00 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
18c10 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20  s[serial_type]; 
18c20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65   .}../*.** If we
18c30 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
18c40 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
18c50 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
18c60 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
18c70 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
18c80 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
18c90 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
18ca0 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
18cb0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
18cc0 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
18cd0 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
18ce0 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
18cf0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
18d00 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
18d10 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
18d20 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
18d30 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
18d40 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
18d50 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
18d60 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
18d70 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
18d80 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
18d90 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
18da0 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
18db0 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
18dc0 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
18dd0 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
18de0 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
18df0 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
18e00 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
18e10 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
18e20 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
18e30 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
18e40 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
18e50 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
18e60 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
18e70 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
18e80 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
18e90 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
18ea0 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
18eb0 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
18ec0 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
18ed0 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
18ee0 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
18ef0 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
18f00 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
18f10 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
18f20 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
18f30 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
18f40 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
18f50 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
18f60 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
18f70 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
18f80 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
18f90 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
18fa0 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
18fb0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
18fc0 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
18fd0 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
18fe0 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
18ff0 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
19000 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
19010 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
19020 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
19030 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
19040 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
19050 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
19060 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
19070 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
19080 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
19090 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
190a0 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
190b0 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
190c0 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
190d0 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
190e0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
190f0 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
19100 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
19110 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
19120 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
19130 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
19140 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
19150 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
19160 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
19170 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
19180 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
19190 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
191a0 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
191b0 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
191c0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
191d0 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
191e0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
191f0 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
19200 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
19210 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
19220 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
19230 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
19240 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
19250 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
19260 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
19270 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
19280 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
19290 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
192a0 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
192b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
192c0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
192d0 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
192e0 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
192f0 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
19300 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
19310 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
19320 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
19330 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
19340 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
19350 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
19360 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
19370 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
19380 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
19390 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
193a0 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
193b0 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
193c0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
193d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
193e0 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
193f0 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
19400 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
19410 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
19420 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
19430 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
19440 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
19450 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
19460 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
19470 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19480 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
19490 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
194a0 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
194b0 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65  t in buf[].  The
194c0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
194d0 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c  nsible.** for al
194e0 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20  locating enough 
194f0 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74  space to buf[] t
19500 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
19510 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69  e field, exclusi
19520 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65  ve.** of the pMe
19530 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73  m->u.nZero bytes
19540 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20   for a MEM_Zero 
19550 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  value..**.** Ret
19560 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19570 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19580 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
19590 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
195a0 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
195b0 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
195c0 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
195d0 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
195e0 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
195f0 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
19600 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
19610 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
19620 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
19630 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  8 *buf, Mem *pMe
19640 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  m, u32 serial_ty
19650 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  pe){.  u32 len;.
19660 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
19670 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
19680 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
19690 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
196a0 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
196b0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
196c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
196d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
196e0 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
196f0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b  of(pMem->u.r) );
19700 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
19710 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69  , &pMem->u.r, si
19720 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
19730 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19740 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
19750 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
19760 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
19770 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
19780 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
19790 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
197a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30  .    assert( i>0
197b0 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   );.    do{.    
197c0 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38    buf[--i] = (u8
197d0 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
197e0 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77   v >>= 8;.    }w
197f0 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72  hile( i );.    r
19800 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
19810 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
19820 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
19830 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
19840 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
19850 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
19860 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
19870 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
19880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
19890 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
198a0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
198b0 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
198c0 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
198d0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20  ;.    if( len>0 
198e0 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d  ) memcpy(buf, pM
198f0 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
19900 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
19910 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
19920 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
19930 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
19940 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69  ../* Input "x" i
19950 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
19960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74  unsigned charact
19970 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65  ers that represe
19980 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69  nt a.** big-endi
19990 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74  an integer.  Ret
199a0 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65  urn the equivale
199b0 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65  nt native intege
199c0 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45  r.*/.#define ONE
199d0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
199e0 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65  ((i8)(x)[0]).#de
199f0 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e  fine TWO_BYTE_IN
19a00 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38  T(x)    (256*(i8
19a10 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d  )((x)[0])|(x)[1]
19a20 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f  ).#define THREE_
19a30 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35  BYTE_INT(x)  (65
19a40 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  536*(i8)((x)[0])
19a50 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29  |((x)[1]<<8)|(x)
19a60 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [2]).#define FOU
19a70 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20  R_BYTE_UINT(x)  
19a80 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32  (((u32)(x)[0]<<2
19a90 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  4)|((x)[1]<<16)|
19aa0 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
19ab0 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  3]).#define FOUR
19ac0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36  _BYTE_INT(x) (16
19ad0 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b  777216*(i8)((x)[
19ae0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  0])|((x)[1]<<16)
19af0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
19b00 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  [3])../*.** Dese
19b10 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
19b20 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
19b30 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
19b40 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
19b50 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
19b60 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
19b70 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
19b80 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19b90 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
19ba0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
19bb0 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20  lemented as two 
19bc0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
19bd0 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63  s for performanc
19be0 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61  e..** The few ca
19bf0 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ses that require
19c00 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
19c10 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20   are broken out 
19c20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a  into a separate.
19c30 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ** routine so th
19c40 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73  at in most cases
19c50 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
19c60 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63   moving the stac
19c70 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20  k pointer.** is 
19c80 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61  avoided..*/ .sta
19c90 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e  tic u32 SQLITE_N
19ca0 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65  OINLINE serialGe
19cb0 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
19cc0 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
19cd0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
19ce0 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
19cf0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
19d00 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
19d10 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
19d20 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
19d30 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
19d60 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
19d70 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
19d80 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
19d90 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75  E_UINT(buf);.  u
19da0 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45  32 y = FOUR_BYTE
19db0 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20  _UINT(buf+4);.  
19dc0 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b  x = (x<<32) + y;
19dd0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
19de0 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==6 ){.    /* 
19df0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19e00 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65  9851-52272 Value
19e10 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19e20 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74   64-bit.    ** t
19e30 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
19e40 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70  nteger. */.    p
19e50 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
19e60 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  *)&x;.    pMem->
19e70 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19e80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
19e90 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
19eb0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33  IDENCE-OF: R-573
19ec0 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69  43-49114 Value i
19ed0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49  s a big-endian I
19ee0 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d  EEE 754-2008 64-
19ef0 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74  bit.    ** float
19f00 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
19f10 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  . */.#if !define
19f20 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
19f30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
19f40 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
19f50 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ).    /* Verify 
19f60 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
19f70 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
19f80 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
19f90 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  same.    ** byte
19fa0 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
19fb0 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
19fc0 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
19fd0 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64  LOAT is.    ** d
19fe0 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
19ff0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
1a000 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
1a010 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a  are mixed.    **
1a020 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a   endian..    */.
1a030 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1a040 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
1a050 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
1a060 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1a070 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
1a080 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20  0;.    u64 t2 = 
1a090 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65  t1;.    swapMixe
1a0a0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
1a0b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
1a0c0 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
1a0d0 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
1a0e0 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
1a0f0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
1a100 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  f.    assert( si
1a110 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
1a120 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d  zeof(pMem->u.r)=
1a130 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69  =8 );.    swapMi
1a140 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
1a150 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
1a160 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69  Mem->u.r, &x, si
1a170 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d  zeof(x));.    pM
1a180 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
1a190 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75  te3IsNaN(pMem->u
1a1a0 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  .r) ? MEM_Null :
1a1b0 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20   MEM_Real;.  }. 
1a1c0 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32   return 8;.}.u32
1a1d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1a1e0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1a1f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1a200 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1a210 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1a220 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1a230 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1a240 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1a250 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1a260 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1a270 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1a280 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1a290 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1a2a0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1a2b0 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
1a2c0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1a2d0 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
1a2e0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1a2f0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
1a300 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
1a310 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
1a320 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
1a330 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20   {  /* Null */. 
1a340 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a350 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33  -OF: R-24078-093
1a360 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55  75 Value is a NU
1a370 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  LL. */.      pMe
1a380 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
1a390 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
1a3a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a3b0 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45   1: {.      /* E
1a3c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
1a3d0 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20  885-25196 Value 
1a3e0 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73  is an 8-bit twos
1a3f0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20  -complement.    
1a400 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f    ** integer. */
1a410 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a420 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
1a430 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a440 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a450 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a460 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a470 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1a480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a490 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1a4a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a4b0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a4c0 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d  NCE-OF: R-49794-
1a4d0 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61  35026 Value is a
1a4e0 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62   big-endian 16-b
1a4f0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1a500 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1a510 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a520 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
1a530 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a540 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a550 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a560 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a570 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a580 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
1a590 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
1a5a0 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
1a5b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1a5c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a5d0 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c  -37839-54301 Val
1a5e0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1a5f0 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20  an 24-bit.      
1a600 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1a610 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1a620 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a630 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1a640 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a650 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a660 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a670 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a680 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
1a690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a6a0 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1a6b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a6c0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a6d0 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d  NCE-OF: R-01849-
1a6e0 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61  26079 Value is a
1a6f0 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
1a700 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1a710 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1a720 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a730 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1a740 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69  YTE_INT(buf);.#i
1a750 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20  fdef __HP_cc .  
1a760 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75      /* Work arou
1a770 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73  nd a sign-extens
1a780 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48  ion bug in the H
1a790 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48  P compiler for H
1a7a0 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66  P/UX */.      if
1a7b0 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20  ( buf[0]&0x80 ) 
1a7c0 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66  pMem->u.i |= 0xf
1a7d0 66 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c  fffffff80000000L
1a7e0 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  L;.#endif.      
1a7f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a800 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a810 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a820 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a830 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
1a840 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1a850 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a860 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a870 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30  VIDENCE-OF: R-50
1a880 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20  385-09674 Value 
1a890 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a8a0 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  48-bit.      ** 
1a8b0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a8c0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a8d0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
1a8e0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1a8f0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1a900 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1a910 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a920 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a930 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a940 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a950 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a960 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
1a970 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
1a980 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a990 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
1a9a0 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
1a9b0 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
1a9c0 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c    /* These use l
1a9d0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20  ocal variables, 
1a9e0 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20  so do them in a 
1a9f0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
1aa00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  .      ** to avo
1aa10 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76  id having to mov
1aa20 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e  e the frame poin
1aa30 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ter in the commo
1aa40 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  n case */.      
1aa50 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74  return serialGet
1aa60 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65  (buf,serial_type
1aa70 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ,pMem);.    }.  
1aa80 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
1aa90 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
1aaa0 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
1aab0 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
1aac0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1aad0 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20  : R-12976-22893 
1aae0 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
1aaf0 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20  eger 0. */.     
1ab00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1ab10 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56   R-18143-12121 V
1ab20 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1ab30 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 1. */.      
1ab40 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
1ab50 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
1ab60 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1ab70 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
1ab80 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1ab90 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1aba0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1abb0 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34  F: R-14606-31564
1abc0 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42   Value is a BLOB
1abd0 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f   that is (N-12)/
1abe0 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20  2 bytes in.     
1abf0 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20   ** length..    
1ac00 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1ac10 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20  : R-28401-00140 
1ac20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  Value is a strin
1ac30 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e  g in the text en
1ac40 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  coding and.     
1ac50 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74   ** (N-13)/2 byt
1ac60 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f  es in length. */
1ac70 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
1ac80 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
1ac90 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
1aca0 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
1acb0 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
1acc0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
1acd0 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
1ace0 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
1acf0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
1ad00 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1ad10 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
1ad20 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
1ad30 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
1ad40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ad50 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
1ad60 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1ad70 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
1ad80 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
1ad90 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
1ada0 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
1adb0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1adc0 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
1add0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1ade0 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
1adf0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ae00 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1ae10 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1ae20 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
1ae30 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
1ae40 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
1ae50 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1ae60 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
1ae70 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
1ae80 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
1ae90 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
1aea0 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
1aeb0 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
1aec0 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
1aed0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
1aee0 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
1aef0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1af00 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
1af10 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
1af20 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
1af30 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1af40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
1af50 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
1af60 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
1af70 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
1af80 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
1af90 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
1afa0 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
1afb0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1afc0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
1afd0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
1afe0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1aff0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
1b000 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
1b010 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
1b020 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1b030 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20 20  Info            
1b040 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1b050 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
1b060 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
1b070 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
1b080 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
1b090 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
1b0a0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  turn */.  int nB
1b0b0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1b0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b0d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
1b0e0 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
1b0f0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
1b100 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1b110 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
1b120 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
1b130 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70  ->nField+1);.  p
1b140 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
1b150 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
1b160 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
1b170 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
1b180 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
1b190 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  0;.  p->aMem = (
1b1a0 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
1b1b0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
1b1c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
1b1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1b1e0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1b1f0 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
1b200 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1b210 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
1b220 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1b230 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1b240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1b250 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1b260 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1b270 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1b280 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1b290 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1b2a0 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1b2b0 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1b2c0 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1b2d0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1b2e0 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1b2f0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1b300 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1b310 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1b320 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1b330 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1b340 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1b350 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1b360 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1b370 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1b380 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1b390 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1b3a0 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1b3b0 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1b3c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1b3d0 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1b3e0 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1b3f0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1b400 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1b410 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1b420 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1b430 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b440 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
1b450 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b480 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1b490 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1b4a0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4c0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b4d0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1b4e0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1b4f0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1b500 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1b510 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1b520 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1b530 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1b540 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1b550 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1b560 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1b570 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1b580 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
1b590 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
1b5a0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
1b5b0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1b5c0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
1b5d0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
1b5e0 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
1b5f0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
1b600 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
1b610 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
1b620 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
1b630 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
1b640 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
1b650 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
1b660 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
1b670 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  loc = 0;.    pMe
1b680 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20  m->z = 0;.    d 
1b690 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1b6a0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
1b6b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
1b6c0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
1b6d0 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
1b6e0 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
1b6f0 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
1b700 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1b710 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
1b720 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
1b730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b740 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
1b750 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1b760 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
1b770 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
1b780 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
1b790 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
1b7a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1b7b0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
1b7c0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
1b7d0 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
1b7e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1b7f0 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
1b800 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
1b810 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
1b820 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1b830 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
1b840 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
1b850 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
1b860 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
1b870 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
1b880 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
1b890 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
1b8a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1b8b0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
1b8c0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
1b8d0 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
1b8e0 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
1b8f0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1b900 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
1b910 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
1b920 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
1b930 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
1b940 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
1b950 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
1b960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1b970 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b980 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
1b990 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1b9a0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1b9b0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
1b9c0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1b9d0 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
1b9e0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
1b9f0 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
1ba00 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
1ba10 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
1ba20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1ba30 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1ba40 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1ba50 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1ba60 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1ba70 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ba80 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1ba90 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
1baa0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
1bab0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
1bac0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1bad0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1bae0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
1baf0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
1bb00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1bb10 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1bb20 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1bb30 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
1bb40 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
1bb50 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
1bb60 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1bb70 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
1bb80 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
1bb90 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
1bba0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1bbb0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
1bbc0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
1bbd0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
1bbe0 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
1bbf0 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
1bc00 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1bc10 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
1bc20 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
1bc30 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
1bc40 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
1bc50 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1bc60 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
1bc70 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
1bc80 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
1bc90 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
1bca0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
1bcb0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
1bcc0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
1bcd0 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
1bce0 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
1bcf0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
1bd00 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
1bd10 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
1bd20 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
1bd30 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
1bd40 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
1bd50 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
1bd60 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
1bd70 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
1bd80 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
1bd90 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
1bda0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1bdb0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
1bdc0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
1bdd0 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
1bde0 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
1bdf0 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
1be00 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
1be10 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
1be20 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
1be30 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
1be40 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
1be50 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
1be60 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
1be70 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
1be80 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1be90 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a  zHdr1);.  if( sz
1bea0 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74  Hdr1>98307 ) ret
1beb0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1bec0 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  PT;.  d1 = szHdr
1bed0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  1;.  assert( pKe
1bee0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1bef0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
1bf00 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1bf10 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1bf20 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1bf30 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1bf40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bf50 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1bf60 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1bf70 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1bf80 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1bf90 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1bfa0 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
1bfb0 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
1bfc0 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
1bfd0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
1bfe0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
1bff0 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
1c000 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
1c010 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
1c020 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
1c030 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
1c040 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20  nough key space 
1c050 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f  remaining to avo
1c060 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  id.    ** a buff
1c070 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68  er overread.  Th
1c080 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  e "d1+serial_typ
1c090 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73  e1+2" subexpress
1c0a0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1c0b0 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65  always be greate
1c0c0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1c0d0 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  to the amount of
1c0e0 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70   required key sp
1c0f0 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20  ace..    ** Use 
1c100 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69  that approximati
1c110 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  on to avoid the 
1c120 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63  more expensive c
1c130 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
1c140 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1c150 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20  ypeLen() in the 
1c160 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20  common case..   
1c170 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73   */.    if( d1+s
1c180 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75  erial_type1+2>(u
1c190 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26  32)nKey1.     &&
1c1a0 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53   d1+sqlite3VdbeS
1c1b0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1c1c0 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29  ial_type1)>(u32)
1c1d0 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20  nKey1 .    ){.  
1c1e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c1f0 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
1c200 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
1c210 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
1c220 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
1c230 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1c240 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1c250 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
1c260 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
1c270 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
1c280 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1c290 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1c2a0 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
1c2b0 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66  aMem[i], pKeyInf
1c2c0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  o->aColl[i]);.  
1c2d0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1c2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1c2f0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1c300 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1c310 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1c320 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1c330 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1c340 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1c350 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
1c360 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
1c370 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
1c380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1c390 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
1c3a0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
1c3b0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1c3c0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
1c3d0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
1c3e0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1c3f0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1c400 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1c410 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1c420 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1c430 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1c440 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1c450 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1c460 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1c470 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1c480 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1c490 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1c4a0 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1c4b0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1c4c0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1c4d0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1c4e0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1c4f0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1c500 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1c510 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1c520 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1c530 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1c540 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1c550 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1c560 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1c570 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1c580 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1c590 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c5a0 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1c5b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c5c0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1c5d0 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1c5e0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1c5f0 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1c600 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1c610 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1c620 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1c630 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1c640 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c650 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1c660 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1c670 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c680 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1c690 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1c6a0 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1c6b0 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1c6c0 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1c6d0 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1c6e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1c6f0 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1c700 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1c710 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1c720 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1c730 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e  >nField + pKeyIn
1c740 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a  fo->nXField..**.
1c750 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
1c760 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
1c770 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73  isfied, it means
1c780 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73   that the high-s
1c790 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f  peed.** vdbeReco
1c7a0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1c7b0 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nd vdbeRecordCom
1c7c0 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75  pareString() rou
1c7d0 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  tines will.** no
1c7e0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1c7f0 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72  .  If this asser
1c800 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20  t() ever fires, 
1c810 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e  it probably mean
1c820 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65  s.** that the Ke
1c830 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20  yInfo.nField or 
1c840 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
1c850 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1c860 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1c870 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1c880 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1c890 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1c8a0 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1c8b0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1c8c0 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1c8d0 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1c8e0 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1c8f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1c900 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1c910 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1c920 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1c930 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1c940 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1c950 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1c960 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1c970 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1c980 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1c990 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1c9a0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1c9b0 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1c9c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1c9d0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1c9e0 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1c9f0 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1ca00 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1ca10 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1ca20 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1ca30 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1ca40 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1ca50 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1ca60 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1ca70 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1ca80 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1ca90 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  nXField );.}.#el
1caa0 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1cab0 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1cac0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1cad0 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1cae0 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1caf0 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1cb00 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1cb10 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1cb20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1cb30 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1cb40 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1cb50 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1cb60 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1cb70 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1cb80 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1cb90 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1cba0 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1cbb0 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1cbc0 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1cbd0 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1cbe0 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1cbf0 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1cc00 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1cc10 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1cc20 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1cc30 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1cc40 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1cc50 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1cc60 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1cc70 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1cc80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1cc90 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1cca0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1ccb0 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1ccc0 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1ccd0 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1cce0 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1ccf0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1cd00 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1cd10 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1cd20 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1cd30 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1cd40 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1cd50 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1cd60 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1cd70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1cd80 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1cd90 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1cda0 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1cdb0 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65  *v1, *v2;.    Me
1cdc0 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1cdd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cde0 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1cdf0 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1ce00 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1ce10 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1ce20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1ce30 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1ce40 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1ce50 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1ce60 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1ce70 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1ce80 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1ce90 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1cea0 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1ceb0 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1cec0 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1ced0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1cee0 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1cef0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cf00 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1cf10 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66  ll->enc);.    if
1cf20 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
1cf30 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
1cf40 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1cf50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1cf60 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  BKPT;.      rc =
1cf70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1cf80 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d       rc = pColl-
1cf90 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1cfa0 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32  er, c1.n, v1, c2
1cfb0 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20  .n, v2);.    }. 
1cfc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1cfd0 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1cfe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1cff0 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1d000 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d010 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
1d020 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75  nput pBlob is gu
1d030 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1d040 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f   Blob that is no
1d050 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68  t marked.** with
1d060 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75   MEM_Zero.  Retu
1d070 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f  rn true if it co
1d080 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c  uld be a zero-bl
1d090 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ob..*/.static in
1d0a0 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73  t isAllZero(cons
1d0b0 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1d0c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1d0d0 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1d0e0 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29  {.    if( z[i] )
1d0f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d100 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1d110 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1d120 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1d130 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1d140 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1d150 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1d160 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1d170 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1d180 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1d190 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1d1a0 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1d1b0 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1d1c0 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1d1d0 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1d1e0 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssor..*/.static 
1d1f0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1d200 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  int sqlite3BlobC
1d210 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1d220 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d   *pB1, const Mem
1d230 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b   *pB2){.  int c;
1d240 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d  .  int n1 = pB1-
1d250 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70  >n;.  int n2 = p
1d260 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20  B2->n;..  /* It 
1d270 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68  is possible to h
1d280 61 76 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65  ave a Blob value
1d290 20 74 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e   that has some n
1d2a0 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a  on-zero content.
1d2b0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
1d2c0 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20   zero content.  
1d2d0 42 75 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f  But that only co
1d2e0 6d 65 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73  mes up for Blobs
1d2f0 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20   formed.  ** by 
1d300 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1d310 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75  d opcode, and su
1d320 63 68 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67  ch Blobs never g
1d330 65 74 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  et passed into. 
1d340 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f   ** sqlite3MemCo
1d350 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73  mpare(). */.  as
1d360 73 65 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67  sert( (pB1->flag
1d370 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1d380 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61   || n1==0 );.  a
1d390 73 73 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61  ssert( (pB2->fla
1d3a0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
1d3b0 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20  0 || n2==0 );.. 
1d3c0 20 69 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73   if( (pB1->flags
1d3d0 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  |pB2->flags) & M
1d3e0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69  EM_Zero ){.    i
1d3f0 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20  f( pB1->flags & 
1d400 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1d410 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72  _Zero ){.      r
1d420 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65  eturn pB1->u.nZe
1d430 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72  ro - pB2->u.nZer
1d440 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  o;.    }else if(
1d450 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45   pB1->flags & ME
1d460 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
1d470 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70  if( !isAllZero(p
1d480 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29  B2->z, pB2->n) )
1d490 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d4a0 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e    return pB1->u.
1d4b0 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20  nZero - n2;.    
1d4c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
1d4d0 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d   !isAllZero(pB1-
1d4e0 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65  >z, pB1->n) ) re
1d4f0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1d500 65 74 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e  eturn n1 - pB2->
1d510 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20  u.nZero;.    }. 
1d520 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28   }.  c = memcmp(
1d530 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20  pB1->z, pB2->z, 
1d540 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29  n1>n2 ? n2 : n1)
1d550 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75  ;.  if( c ) retu
1d560 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e  rn c;.  return n
1d570 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1 - n2;.}../*.**
1d580 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   Do a comparison
1d590 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69   between a 64-bi
1d5a0 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
1d5b0 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c   and a 64-bit fl
1d5c0 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20  oating-point.** 
1d5d0 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
1d5e0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1d5f0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1d600 68 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69  he first (i64) i
1d610 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20  s less than,.** 
1d620 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1d630 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1d640 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a  cond (double)..*
1d650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1d660 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1d670 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c  are(i64 i, doubl
1d680 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65  e r){.  if( size
1d690 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59  of(LONGDOUBLE_TY
1d6a0 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e  PE)>8 ){.    LON
1d6b0 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d  GDOUBLE_TYPE x =
1d6c0 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50   (LONGDOUBLE_TYP
1d6d0 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72  E)i;.    if( x<r
1d6e0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d6f0 20 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75    if( x>r ) retu
1d700 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  rn +1;.    retur
1d710 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
1d720 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75    i64 y;.    dou
1d730 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72  ble s;.    if( r
1d740 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  <-92233720368547
1d750 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e  75808.0 ) return
1d760 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39   +1;.    if( r>9
1d770 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1d780 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  07.0 ) return -1
1d790 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72  ;.    y = (i64)r
1d7a0 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20  ;.    if( i<y ) 
1d7b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1d7c0 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20  f( i>y ){.      
1d7d0 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f  if( y==SMALLEST_
1d7e0 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29  INT64 && r>0.0 )
1d7f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d800 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20    return +1;.   
1d810 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62   }.    s = (doub
1d820 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c  le)i;.    if( s<
1d830 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1d840 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74     if( s>r ) ret
1d850 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1d860 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
1d870 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1d880 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1d890 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1d8a0 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1d8b0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1d8c0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1d8d0 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1d8e0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1d8f0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1d900 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1d910 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1d920 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1d930 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1d940 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1d950 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1d960 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1d970 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1d980 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1d990 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1d9a0 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1d9b0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1d9c0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1d9d0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1d9e0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1d9f0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1da00 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1da10 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1da20 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1da30 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1da40 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1da50 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1da60 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1da70 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1da80 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1da90 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1daa0 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1dab0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1dac0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1dad0 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
1dae0 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
1daf0 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
1db00 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1db10 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1db20 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1db30 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1db40 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1db50 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1db60 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1db70 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1db80 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1db90 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1dba0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1dbb0 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   At least one of
1dbc0 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
1dbd0 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f  is a number.  */
1dbe0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1dbf0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1dc00 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1dc10 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1dc20 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1dc30 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1dc40 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
1dc50 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1dc60 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1dc70 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
1dc80 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1dc90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1dca0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  }.    if( (f1 & 
1dcb0 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d  f2 & MEM_Real)!=
1dcc0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1dcd0 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d  Mem1->u.r < pMem
1dce0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1dcf0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1dd00 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32  em1->u.r > pMem2
1dd10 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b  ->u.r ) return +
1dd20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1dd30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1dd40 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1dd50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1dd60 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  2&MEM_Real)!=0 )
1dd70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1dd80 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1dd90 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75  Compare(pMem1->u
1dda0 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b  .i, pMem2->u.r);
1ddb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ddc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1ddd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dde0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1ddf0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1de00 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1de10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1de20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49  return -sqlite3I
1de30 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1de40 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31  Mem2->u.i, pMem1
1de50 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1de60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1de70 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1de80 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1de90 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   +1;.  }..  /* I
1dea0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1deb0 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1dec0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1ded0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1dee0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1def0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1df00 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1df10 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1df20 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1df30 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1df40 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1df50 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1df60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1df70 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1df80 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1df90 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1dfa0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1dfb0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1dfc0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1dfd0 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e  ->enc || pMem1->
1dfe0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e000 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1e010 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1e020 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1e030 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1e040 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1e050 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1e060 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1e070 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e080 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1e090 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1e0a0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1e0b0 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1e0c0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1e0d0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1e0e0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
1e0f0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
1e100 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
1e110 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
1e120 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
1e130 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
1e140 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
1e150 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1e160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1e170 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1e180 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
1e190 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
1e1a0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
1e1b0 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
1e1c0 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
1e1d0 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
1e1e0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
1e1f0 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
1e200 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
1e210 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
1e220 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
1e230 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
1e240 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
1e250 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
1e260 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
1e270 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
1e280 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
1e290 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1e2a0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1e2b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e2c0 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
1e2d0 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1e2e0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
1e2f0 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
1e300 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
1e310 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
1e320 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
1e330 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1e340 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
1e350 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
1e360 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
1e370 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
1e380 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
1e390 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1e3a0 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
1e3b0 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
1e3c0 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
1e3d0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
1e3e0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
1e3f0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
1e400 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
1e410 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1e420 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
1e430 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
1e440 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
1e450 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
1e460 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1e470 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
1e480 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
1e490 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e4a0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e4b0 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
1e4c0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1e4d0 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
1e4e0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1e4f0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1e500 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
1e510 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1e520 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
1e530 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e540 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e550 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1e560 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1e570 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
1e580 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e590 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
1e5a0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e5b0 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
1e5c0 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
1e5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e5e0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
1e5f0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1e600 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1e610 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
1e620 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1e630 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1e640 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e650 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1e660 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
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 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1e690 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1e6a0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
1e6b0 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
1e6c0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
1e6d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e6e0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
1e6f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1e700 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
1e710 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
1e720 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1e730 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
1e740 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
1e750 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
1e760 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
1e770 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
1e780 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
1e790 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
1e7a0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1e7b0 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
1e7c0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1e7d0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
1e7e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
1e7f0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
1e800 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
1e810 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
1e820 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
1e830 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1e840 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
1e850 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
1e860 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
1e870 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
1e880 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
1e890 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
1e8a0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1e8b0 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
1e8c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
1e8d0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1e8e0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1e8f0 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
1e900 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1e910 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1e920 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1e930 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
1e940 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
1e950 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1e960 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
1e970 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
1e980 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
1e990 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
1e9a0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
1e9b0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1e9c0 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
1e9d0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
1e9e0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1e9f0 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
1ea00 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
1ea10 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
1ea20 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
1ea30 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
1ea40 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
1ea50 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
1ea60 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
1ea70 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1ea80 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
1ea90 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1eaa0 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
1eab0 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
1eac0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
1ead0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1eae0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
1eaf0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1eb00 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
1eb10 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1eb20 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1eb30 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1eb40 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1eb50 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1eb60 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1eb70 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1eba0 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1ebb0 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1ebc0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ebe0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1ebf0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1ec00 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1ec10 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec30 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
1ec40 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
1ec50 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1ec80 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
1ec90 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
1eca0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
1ecb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1ecc0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
1ecd0 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
1ece0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1ed10 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
1ed20 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
1ed30 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1ed40 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
1ed50 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
1ed60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1ed70 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1ed80 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
1ed90 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1eda0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1edb0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1edc0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1edd0 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
1ede0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
1edf0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1ee00 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
1ee10 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
1ee20 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1ee30 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1ee40 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
1ee50 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
1ee60 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
1ee70 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
1ee80 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
1ee90 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
1eea0 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
1eeb0 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
1eec0 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
1eed0 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
1eee0 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
1eef0 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
1ef00 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
1ef10 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
1ef20 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1ef30 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
1ef40 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
1ef50 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
1ef60 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1ef70 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
1ef80 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
1ef90 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
1efa0 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
1efb0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1efc0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1efd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1efe0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1eff0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1f000 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
1f010 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28    }..  VVA_ONLY(
1f020 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1f030 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1f040 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1f050 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1f060 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1f070 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1f080 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1f090 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1f0a0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1f0b0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1f0c0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1f0d0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1f0e0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1f0f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1f100 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1f110 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1f120 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1f130 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1f140 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1f150 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1f160 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1f170 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1f180 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1f190 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1f1a0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1f1b0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1f1c0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1f1d0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1f1e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1f1f0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1f200 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1f220 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1f230 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1f240 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f250 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1f260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f270 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1f280 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1f290 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1f2a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71          rc = -sq
1f2b0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1f2c0 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20  pare(pRhs->u.i, 
1f2d0 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20  mem1.u.r);.     
1f2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f2f0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1f300 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1f310 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1f320 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1f330 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1f340 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1f350 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1f360 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f370 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f380 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1f390 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1f3a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f3b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f3c0 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1f3d0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1f3e0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1f3f0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1f400 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1f410 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1f420 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1f430 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
1f440 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
1f450 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
1f460 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
1f470 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
1f480 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
1f490 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
1f4a0 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
1f4b0 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
1f4c0 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
1f4d0 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
1f4e0 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
1f4f0 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
1f500 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
1f510 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
1f520 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
1f530 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
1f540 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f550 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1f560 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1f570 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f5a0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1f5b0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1f5c0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1f5d0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f5e0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1f5f0 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
1f600 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  <pRhs->u.r ){.  
1f610 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1f620 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
1f630 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
1f640 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
1f650 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1f660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f680 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f690 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1f6a0 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68  re(mem1.u.i, pRh
1f6b0 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20  s->u.r);.       
1f6c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1f6d0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1f6e0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
1f6f0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1f700 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1f710 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1f720 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1f730 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1f740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f750 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f770 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1f780 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1f790 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f7a0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1f7b0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1f7c0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1f7e0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
1f7f0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1f800 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f810 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
1f820 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f830 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f840 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
1f850 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1f860 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1f870 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
1f880 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1f890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1f8a0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1f8b0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1f8c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1f8d0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1f8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1f8f0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1f900 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1f910 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1f920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1f930 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1f940 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1f950 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1f960 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1f970 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1f980 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1f990 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1f9a0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1f9b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1f9c0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1f9d0 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
1f9e0 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
1f9f0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1fa00 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
1fa10 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
1fa20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1fa30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1fa40 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
1fa50 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1fa60 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1fa70 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1fa80 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1fa90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1faa0 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
1fab0 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
1fac0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fad0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1fae0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
1faf0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1fb00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1fb10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1fb20 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  ( (pRhs->flags &
1fb30 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
1fb40 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20   pRhs->n==0 );. 
1fb50 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1fb60 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1fb70 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1fb80 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1fb90 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1fba0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1fbb0 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72  _type<12 || (ser
1fbc0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1fbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fbe0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1fbf0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
1fc00 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
1fc10 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1fc20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1fc30 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67  d1+nStr)==(unsig
1fc40 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1fc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1fc60 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73  d1+nStr+1)==(uns
1fc70 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1fc80 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e         if( (d1+n
1fc90 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  Str) > (unsigned
1fca0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1fcb0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1fcc0 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1fcd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fce0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1fcf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fd00 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1fd10 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1fd20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1fd30 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1fd40 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73           if( !is
1fd50 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63  AllZero((const c
1fd60 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c  har*)&aKey1[d1],
1fd70 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20  nStr) ){.       
1fd80 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
1fd90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fda0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1fdb0 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a  Str - pRhs->u.nZ
1fdc0 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ero;.          }
1fdd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1fde0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1fdf0 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70  mp = MIN(nStr, p
1fe00 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1fe10 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1fe20 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1fe30 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1fe40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1fe50 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
1fe60 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s->n;.        }.
1fe70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fe80 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c     /* RHS is nul
1fe90 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20  l */.    else{. 
1fea0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1feb0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1fec0 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69        rc = (seri
1fed0 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20  al_type!=0);.   
1fee0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
1fef0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1ff00 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1ff10 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1ff20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
1ff30 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1ff40 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1ff50 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1ff60 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1ff70 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  c) );.      asse
1ff80 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1ff90 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1ffa0 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1ffb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ffc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b  ;.    }..    i++
1ffd0 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
1ffe0 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1fff0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
20000 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
20010 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
20020 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
20030 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  al_type);.  }whi
20040 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e  le( idx1<(unsign
20050 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70  ed)szHdr1 && i<p
20060 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26  PKey2->nField &&
20070 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
20080 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
20090 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
200a0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
200b0 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
200c0 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
200d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
200e0 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
200f0 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
20100 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
20110 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
20120 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
20130 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
20140 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
20150 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
20160 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
20170 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
20180 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
20190 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
201a0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
201b0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
201c0 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
201d0 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
201e0 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
201f0 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
20200 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
20210 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
20220 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
20230 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
20240 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
20250 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
20260 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20270 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
20280 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
20290 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
202a0 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
202b0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 1;.  return p
202c0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
202d0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
202e0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
202f0 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
20300 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
20310 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
20320 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20330 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
20340 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
20350 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  ey */.){.  retur
20360 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
20370 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
20380 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
20390 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a   pPKey2, 0);.}..
203a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
203b0 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
203c0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
203d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
203e0 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
203f0 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
20400 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
20410 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  2 is an integer,
20420 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a   and (b) the .**
20430 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
20440 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74  varint at the st
20450 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
20460 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
20470 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69  ingle.** byte (i
20480 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .e. is less than
20490 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   128)..**.** To 
204a0 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61  avoid concerns a
204b0 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72  bout buffer over
204c0 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74  reads, this rout
204d0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
204e0 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77  .** on schemas w
204f0 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  here the maximum
20500 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69   valid header si
20510 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f  ze is 63 bytes o
20520 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  r less..*/.stati
20530 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
20540 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e  CompareInt(.  in
20550 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
20560 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
20570 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
20580 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
20590 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
205a0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
205b0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d  const u8 *aKey =
205c0 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   &((const u8*)pK
205d0 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a  ey1)[*(const u8*
205e0 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a  )pKey1 & 0x3F];.
205f0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
20600 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29  e = ((const u8*)
20610 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74  pKey1)[1];.  int
20620 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20   res;.  u32 y;. 
20630 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b   u64 x;.  i64 v;
20640 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76  .  i64 lhs;..  v
20650 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
20660 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
20670 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20680 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  Key2->pKeyInfo);
20690 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38  .  assert( (*(u8
206a0 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c  *)pKey1)<=0x3F |
206b0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
206c0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
206d0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
206e0 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
206f0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
20700 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f  */.      lhs = O
20710 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
20720 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20730 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
20740 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20750 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
20760 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
20770 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
20780 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  hs = TWO_BYTE_IN
20790 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
207a0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
207b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
207c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
207d0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
207e0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
207f0 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45       lhs = THREE
20800 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20820 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20830 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20840 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
20850 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20860 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d  ger */.      y =
20870 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20880 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73  aKey);.      lhs
20890 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26   = (i64)*(int*)&
208a0 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  y;.      testcas
208b0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
208c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
208d0 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
208e0 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
208f0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
20900 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  hs = FOUR_BYTE_U
20910 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28  INT(aKey+2) + ((
20920 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
20930 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20940 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20950 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20970 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d   case 6: { /* 8-
20980 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20990 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d  ger */.      x =
209a0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
209b0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d  aKey);.      x =
209c0 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
209d0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
209e0 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a  );.      lhs = *
209f0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
20a00 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20a10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20a20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
20a30 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30  : .      lhs = 0
20a40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20a50 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20     case 9:.     
20a60 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20   lhs = 1;.      
20a70 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54  break;..    /* T
20a80 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62  his case could b
20a90 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75  e removed withou
20aa0 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72  t changing the r
20ab0 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e  esults of runnin
20ac0 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  g.    ** this co
20ad0 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74  de. Including it
20ae0 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67   causes gcc to g
20af0 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72  enerate a faster
20b00 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20   switch .    ** 
20b10 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65  statement (since
20b20 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77   the range of sw
20b30 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77  itch targets now
20b40 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20   starts at zero 
20b50 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f  and.    ** is co
20b60 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f  ntiguous) but do
20b70 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
20b80 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20   duplicate code 
20b90 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  to be generated.
20ba0 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69      ** (as gcc i
20bb0 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20  s clever enough 
20bc0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74  to combine the t
20bd0 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20  wo like cases). 
20be0 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  Other .    ** co
20bf0 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65  mpilers might be
20c00 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20   similar.  */ . 
20c10 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20     case 0: case 
20c20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  7:.      return 
20c30 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20c40 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
20c50 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
20c60 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
20c70 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20c80 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20c90 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
20ca0 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a  , pPKey2);.  }..
20cb0 20 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d    v = pPKey2->aM
20cc0 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28  em[0].u.i;.  if(
20cd0 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
20ce0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
20cf0 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
20d00 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
20d10 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
20d20 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
20d30 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
20d40 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
20d50 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
20d60 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
20d70 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
20d80 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
20d90 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
20da0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20db0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
20dc0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
20dd0 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65  pPKey2, 1);.  }e
20de0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
20df0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
20e00 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
20e10 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65   equal and there
20e20 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67   are no trailing
20e30 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
20e40 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  Return pPKey2->d
20e50 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69  efault_rc in thi
20e60 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  s case. */.    r
20e70 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
20e80 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b  ault_rc;.    pPK
20e90 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
20ea0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20eb0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20ec0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
20ed0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
20ee0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ) );.  return re
20ef0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
20f00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
20f10 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
20f20 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
20f30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
20f40 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
20f50 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
20f60 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
20f70 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
20f80 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
20f90 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
20fa0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
20fb0 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
20fc0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
20fd0 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
20fe0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
20ff0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
21000 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
21010 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21020 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
21030 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
21040 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
21050 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
21060 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
21070 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
21080 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
21090 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
210a0 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20  nst u8 *aKey1 = 
210b0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
210c0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
210d0 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ype;.  int res;.
210e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
210f0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  2->aMem[0].flags
21100 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
21110 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
21120 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
21130 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21140 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
21150 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28  ;.  getVarint32(
21160 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61  &aKey1[1], seria
21170 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73  l_type);.  if( s
21180 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
21190 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
211a0 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28  2->r1;      /* (
211b0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
211c0 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75  a number or a nu
211d0 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ll */.  }else if
211e0 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
211f0 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20  & 0x01) ){ .    
21200 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
21210 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
21220 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f  /nKey1) is a blo
21230 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b */.  }else{.  
21240 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
21250 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e  int nStr;.    in
21260 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b  t szHdr = aKey1[
21270 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20  0];..    nStr = 
21280 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
21290 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73   / 2;.    if( (s
212a0 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e  zHdr + nStr) > n
212b0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50  Key1 ){.      pP
212c0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
212d0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
212e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
212f0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43  eturn 0;    /* C
21300 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
21310 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49   }.    nCmp = MI
21320 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  N( pPKey2->aMem[
21330 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20  0].n, nStr );.  
21340 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26    res = memcmp(&
21350 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50  aKey1[szHdr], pP
21360 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c  Key2->aMem[0].z,
21370 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28   nCmp);..    if(
21380 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
21390 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50   res = nStr - pP
213a0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b  Key2->aMem[0].n;
213b0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
213c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
213d0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
213e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
213f0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
21400 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
21410 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
21420 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
21430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21440 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70           res = p
21450 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
21460 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  c;.          pPK
21470 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
21480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21490 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
214a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
214b0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
214c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
214d0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
214e0 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
214f0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
21500 20 29 7b 0a 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 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
21530 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
21540 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
21550 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
21560 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
21570 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
21580 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20   res).       || 
21590 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20  CORRUPT_DB.     
215a0 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
215b0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
215c0 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
215d0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
215e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
215f0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
21600 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21610 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65  are() compatible
21620 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69   function.** sui
21630 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72  table for compar
21640 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72  ing serialized r
21650 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e  ecords to the un
21660 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61  packed record pa
21670 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
21680 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
21690 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73  .RecordCompare s
216a0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
216b0 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65  mpare(UnpackedRe
216c0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76  cord *p){.  /* v
216d0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
216e0 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69  reInt() and vari
216f0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  ntRecordCompareS
21700 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73  tring() both ass
21710 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ume.  ** that th
21720 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
21730 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63   varint that occ
21740 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74  urs at the start
21750 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a   of each record.
21760 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73    ** fits in a s
21770 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e  ingle byte (i.e.
21780 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29   is 127 or less)
21790 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  . varintRecordCo
217a0 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20  mpareInt().  ** 
217b0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
217c0 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
217d0 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65  overread a buffe
217e0 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68  r by at least th
217f0 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  e .  ** maximum 
21800 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68  possible legal h
21810 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20  eader size plus 
21820 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65  8 bytes. Because
21830 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67   there is.  ** g
21840 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
21850 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74  at least 74 (but
21860 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20   not 136) bytes 
21870 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f  of padding follo
21880 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62  wing each.  ** b
21890 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
218a0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
218b0 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61  areInt() this ma
218c0 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e  kes it convenien
218d0 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20  t to.  ** limit 
218e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
218f0 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74  header to 64 byt
21900 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  es in cases wher
21910 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  e the first fiel
21920 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  d.  ** is an int
21930 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger..  **.  ** 
21940 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  The easiest way 
21950 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
21960 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73  limit is to cons
21970 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64  ider only record
21980 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66  s with.  ** 13 f
21990 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49  ields or less. I
219a0 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  f the first fiel
219b0 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  d is an integer,
219c0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   the maximum leg
219d0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73  al.  ** header s
219e0 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31  ize is (12*5 + 1
219f0 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f   + 1) bytes.  */
21a00 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49  .  if( (p->pKeyI
21a10 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d  nfo->nField + p-
21a20 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
21a30 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  ld)<=13 ){.    i
21a40 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
21a50 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
21a60 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
21a70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
21a80 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
21a90 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
21aa0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
21ab0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
21ac0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
21ad0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
21ae0 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
21af0 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
21b00 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
21b10 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
21b20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21b30 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
21b40 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21b50 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
21b60 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21b70 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
21b80 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
21b90 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
21ba0 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
21bb0 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
21bc0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
21bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
21be0 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
21bf0 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
21c00 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
21c10 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
21c20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
21c30 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
21c40 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
21c50 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
21c60 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
21c70 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
21c80 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
21c90 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
21ca0 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
21cb0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
21cc0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
21cd0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
21ce0 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
21cf0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
21d00 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
21d10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
21d20 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
21d30 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
21d40 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
21d50 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
21d60 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
21d70 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
21d80 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
21d90 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
21da0 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
21db0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
21dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
21dd0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
21de0 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
21df0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
21e00 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
21e10 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
21e20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
21e30 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21e40 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
21e50 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
21e60 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
21e70 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
21e80 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
21e90 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
21ea0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
21eb0 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
21ec0 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
21ed0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
21ee0 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
21ef0 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
21f00 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
21f10 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
21f20 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
21f30 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
21f40 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
21f50 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
21f60 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
21f70 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21f80 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
21f90 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
21fa0 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
21fb0 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
21fc0 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
21fd0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
21fe0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
21ff0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
22000 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
22010 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
22020 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
22030 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
22040 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
22050 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
22060 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
22070 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
22080 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
22090 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
220a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
220b0 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
220c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
220d0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
220e0 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
220f0 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66  llKey, &m);.  if
22100 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
22110 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
22120 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   The index entry
22130 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
22140 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a   a header size *
22150 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
22160 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
22170 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61  szHdr);.  testca
22180 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a  se( szHdr==3 );.
22190 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
221a0 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20  r==m.n );.  if( 
221b0 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33  unlikely(szHdr<3
221c0 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d   || (int)szHdr>m
221d0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
221e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
221f0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
22200 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
22210 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
22220 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
22230 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
22240 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
22250 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
22260 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
22270 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
22280 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
22290 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
222a0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
222b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
222c0 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
222d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
222e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
222f0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
22300 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22310 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
22320 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22330 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
22340 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
22350 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22360 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
22370 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22380 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
22390 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
223a0 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
223b0 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
223c0 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
223d0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
223e0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
223f0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
22400 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
22410 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
22420 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
22430 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
22440 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
22450 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
22460 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
22470 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
22480 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
22490 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
224a0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
224b0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
224c0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
224d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
224e0 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
224f0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
22500 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
22510 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
22520 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22530 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
22540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
22550 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
22560 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
22570 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
22580 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
22590 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
225a0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
225b0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
225c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
225d0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
225e0 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
225f0 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
22600 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
22610 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
22620 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
22630 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
22650 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
22660 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
22670 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
22680 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
22690 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
226a0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
226b0 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
226c0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
226d0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
226e0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
226f0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
22700 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
22710 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
22720 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
22730 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
22740 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
22750 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
22760 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
22770 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
22780 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
22790 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
227a0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
227b0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
227c0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
227d0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
227e0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
227f0 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
22800 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
22810 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
22820 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
22830 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
22840 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
22850 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
22860 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
22870 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
22880 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
22890 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
228b0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
228c0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
228d0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
228e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
228f0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
22900 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
22910 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22920 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
22930 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
22940 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
22950 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
22980 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
22990 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
229a0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
229b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
229c0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
229d0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
229e0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
229f0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
22a00 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
22a10 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
22a20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
22a30 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
22a40 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
22a50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
22a60 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
22a70 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
22a80 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
22a90 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
22aa0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
22ab0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
22ac0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
22ad0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
22ae0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
22af0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
22b00 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
22b10 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
22b20 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
22b30 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
22b40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22b50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22b60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
22b70 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
22b80 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
22b90 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
22ba0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
22bb0 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
22bc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22bd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22be0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
22bf0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22c00 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
22c10 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
22c20 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
22c30 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
22c40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
22c60 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
22c70 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
22c80 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
22c90 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
22ca0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
22cb0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
22cc0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
22cd0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
22ce0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
22cf0 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
22d00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22d10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
22d20 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
22d30 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
22d40 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
22d50 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
22d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
22d70 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
22d80 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
22d90 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
22da0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
22db0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
22dc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22dd0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
22de0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
22df0 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
22e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
22e10 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
22e20 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
22e30 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
22e40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
22e50 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
22e60 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
22e70 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
22e80 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
22e90 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
22ea0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
22eb0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
22ec0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
22ed0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
22ee0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
22ef0 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
22f00 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
22f10 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
22f20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
22f30 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
22f40 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
22f50 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
22f60 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
22f70 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
22f80 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
22f90 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
22fa0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
22fb0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
22fc0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
22fd0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
22fe0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
22ff0 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
23000 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
23010 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
23020 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
23030 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
23040 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23050 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
23060 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
23070 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
23080 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
23090 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
230a0 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20   SQLITE_PREPARE 
230b0 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62 65  flags for a Vdbe
230c0 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56  ..*/.u8 sqlite3V
230d0 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
230e0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
230f0 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b  rn v->prepFlags;
23100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23110 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
23120 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
23130 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
23140 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
23150 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
23160 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
23170 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
23180 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
23190 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
231a0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
231b0 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
231c0 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
231d0 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
231e0 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
231f0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
23200 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
23210 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
23220 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
23230 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
23240 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
23250 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
23260 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
23270 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
23280 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
23290 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
232a0 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
232b0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
232c0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
232d0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
232e0 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
232f0 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e      assert( (v->
23300 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
23310 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
23320 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
23330 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
23340 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
23350 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
23360 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
23370 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
23380 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
23390 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
233a0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
233b0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
233c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
233d0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
233e0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
233f0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
23400 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
23410 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
23420 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23430 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
23440 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
23450 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
23460 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
23470 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
23480 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
23490 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
234a0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
234b0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
234c0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
234d0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
234e0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
234f0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
23500 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
23510 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d  );.  assert( (v-
23530 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
23540 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
23550 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  =0 );.  if( iVar
23560 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  >=32 ){.    v->e
23570 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30  xpmask |= 0x8000
23580 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0000;.  }else{. 
23590 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
235a0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
235b0 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
235c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
235d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
235e0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
235f0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
23600 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
23610 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
23620 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
23630 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
23640 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
23650 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
23660 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
23670 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
23680 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
23690 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
236a0 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
236b0 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
236c0 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
236d0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
236e0 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e  ){.  if( pVtab->
236f0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73  zErrMsg ){.    s
23700 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
23710 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  db;.    sqlite3D
23720 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
23730 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
23740 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
23750 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
23760 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
23770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
23780 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
23790 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73     pVtab->zErrMs
237a0 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  g = 0;.  }.}.#en
237b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
237c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
237d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
237e0 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
237f0 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49  TE_HOOK../*.** I
23800 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
23810 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
23820 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61  L, release any a
23830 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
23840 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74  iated .** with t
23850 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  he memory cells 
23860 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d  in the p->aMem[]
23870 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65   array. Also fre
23880 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65  e the UnpackedRe
23890 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
238a0 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20  e itself, using 
238b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
238c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
238d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
238e0 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63  free UnpackedRec
238f0 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61  ord structures a
23900 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
23910 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63  he vdbeUnpackRec
23920 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ord() function f
23930 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e  ound in vdbeapi.
23940 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
23950 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b  d vdbeFreeUnpack
23960 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
23970 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70 61  int nField, Unpa
23980 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
23990 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
239a0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
239b0 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b  0; i<nField; i++
239c0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d  ){.      Mem *pM
239d0 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d  em = &p->aMem[i]
239e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
239f0 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  ->zMalloc ) sqli
23a00 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23a10 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(pMem);.    }. 
23a20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23a30 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  NN(db, p);.  }.}
23a40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23a50 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
23a60 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64  TE_HOOK */..#ifd
23a70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
23a80 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
23a90 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
23aa0 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
23ab0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
23ac0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
23ad0 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c   pre-update call
23ae0 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72  ,.** then cursor
23af0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23b00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
23b10 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74  hould point to t
23b20 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20  he row about.** 
23b30 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20  to be update or 
23b40 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20  deleted. If the 
23b50 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c  application call
23b60 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  s sqlite3_preupd
23b70 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68  ate_old(),.** th
23b80 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65  e required value
23b90 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
23ba0 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  om the row the c
23bb0 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e  ursor points to.
23bc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23bd0 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f  VdbePreUpdateHoo
23be0 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  k(.  Vdbe *v,   
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c00 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65       /* Vdbe pre
23c10 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20  -update hook is 
23c20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20  invoked by */.  
23c30 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72  VdbeCursor *pCsr
23c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23c50 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61  /* Cursor to gra
23c60 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66  b old.* values f
23c70 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  rom */.  int op,
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
23ca0 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54  TE_INSERT, UPDAT
23cb0 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20  E or DELETE */. 
23cc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
23cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ce0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
23cf0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
23d00 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
23d10 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69         /* Modifi
23d20 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36  ed table */.  i6
23d30 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20  4 iKey1,        
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d50 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c   Initial key val
23d60 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  ue */.  int iReg
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
23d90 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65  ter for new.* re
23da0 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  cord */.){.  sql
23db0 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62  ite3 *db = v->db
23dc0 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20  ;.  i64 iKey2;. 
23dd0 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70   PreUpdate preup
23de0 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  date;.  const ch
23df0 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d  ar *zTbl = pTab-
23e00 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63  >zName;.  static
23e10 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f   const u8 fakeSo
23e20 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20  rtOrder = 0;..  
23e30 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65  assert( db->pPre
23e40 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d  Update==0 );.  m
23e50 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65  emset(&preupdate
23e60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55  , 0, sizeof(PreU
23e70 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 48  pdate));.  if( H
23e80 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d 30  asRowid(pTab)==0
23e90 20 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d 20   ){.    iKey1 = 
23ea0 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20 70  iKey2 = 0;.    p
23eb0 72 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20 73  reupdate.pPk = s
23ec0 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
23ed0 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d  Index(pTab);.  }
23ee0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f 70  else{.    if( op
23ef0 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
23f00 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d  ){.      iKey2 =
23f10 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75   v->aMem[iReg].u
23f20 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
23f30 20 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65       iKey2 = iKe
23f40 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  y1;.    }.  }.. 
23f50 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e   assert( pCsr->n
23f60 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
23f70 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43  l .       || (pC
23f80 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62  sr->nField==pTab
23f90 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d  ->nCol+1 && op==
23fa0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26  SQLITE_DELETE &&
23fb0 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a   iReg==-1).  );.
23fc0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d  .  preupdate.v =
23fd0 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e   v;.  preupdate.
23fe0 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70  pCsr = pCsr;.  p
23ff0 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70  reupdate.op = op
24000 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e  ;.  preupdate.iN
24010 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  ewReg = iReg;.  
24020 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
24030 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65  o.db = db;.  pre
24040 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65  update.keyinfo.e
24050 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
24060 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
24070 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d  o.nField = pTab-
24080 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61  >nCol;.  preupda
24090 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74  te.keyinfo.aSort
240a0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61  Order = (u8*)&fa
240b0 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70  keSortOrder;.  p
240c0 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d  reupdate.iKey1 =
240d0 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64   iKey1;.  preupd
240e0 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79  ate.iKey2 = iKey
240f0 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70  2;.  preupdate.p
24100 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 64  Tab = pTab;..  d
24110 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
24120 26 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62  &preupdate;.  db
24130 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
24140 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64  back(db->pPreUpd
24150 61 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20  ateArg, db, op, 
24160 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31  zDb, zTbl, iKey1
24170 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e  , iKey2);.  db->
24180 70 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a  pPreUpdate = 0;.
24190 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
241a0 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52  db, preupdate.aR
241b0 65 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72  ecord);.  vdbeFr
241c0 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
241d0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
241e0 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70  .nField+1, preup
241f0 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b  date.pUnpacked);
24200 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
24210 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
24220 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64  e.keyinfo.nField
24230 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e  +1, preupdate.pN
24240 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69  ewUnpacked);.  i
24250 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  f( preupdate.aNe
24260 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  w ){.    int i;.
24270 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
24280 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b  Csr->nField; i++
24290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
242a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
242b0 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69  preupdate.aNew[i
242c0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
242d0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
242e0 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  , preupdate.aNew
242f0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
24300 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
24310 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
24320 2a 2f 0a                                         */.