/ Hex Artifact Content
Login

Artifact 1f15018ef7abe22669967f70b02bfe6709be403f126f713dabb091b9d631859a:


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 20 20 20 20 20 20 20 20        }.        
4730: 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20  case OP_Next:.  
4740: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
4750: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20  xtIfOpen:.      
4760: 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72    case OP_Sorter
4770: 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  Next: {.        
4780: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
4790: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
47a0: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  eNext;.         
47b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
47c0: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
47d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
47e0: 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72   generator never
47f0: 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68   codes any of th
4800: 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61  ese opcodes as a
4810: 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20   jump.          
4820: 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20  ** to a label.  
4830: 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  They are always 
4840: 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20  coded as a jump 
4850: 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a  backwards to a .
4860: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f            ** kno
4870: 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  wn address */.  
4880: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4890: 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  pOp->p2>=0 );.  
48a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
48b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
48c0: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20   case OP_Prev:. 
48d0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50         case OP_P
48e0: 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20  revIfOpen: {.   
48f0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
4900: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
4910: 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b 0a  3BtreePrevious;.
4920: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
4930: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
4940: 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  CE;.          /*
4950: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
4960: 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20  tor never codes 
4970: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63  any of these opc
4980: 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20  odes as a jump. 
4990: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
49a0: 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72   label.  They ar
49b0: 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61  e always coded a
49c0: 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72  s a jump backwar
49d0: 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20  ds to a .       
49e0: 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72     ** known addr
49f0: 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ess */.         
4a00: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4a10: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
4a20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4a30: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
4a40: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4a50: 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  LE.        case 
4a60: 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20  OP_VUpdate: {.  
4a70: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
4a80: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
4a90: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
4aa0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  2;.          bre
4ab0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4ac0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
4ad0: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
4ae0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
4af0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70      assert( (pOp
4b00: 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20   - p->aOp) >= 3 
4b10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
4b20: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
4b30: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
4b40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  );.          n =
4b50: 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
4b60: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
4b70: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
4b80: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   = n;.          
4b90: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
4ba0: 69 6e 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  into the default
4bb0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 20   case */.       
4bc0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
4bd0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4be0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
4bf0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
4c00: 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63      /* The mkopc
4c10: 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 20  odeh.tcl script 
4c20: 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 20  has so arranged 
4c30: 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 20  things that the 
4c40: 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20 20 20  only.           
4c50: 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63   ** non-jump opc
4c60: 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20 53  odes less than S
4c70: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f  QLITE_MX_JUMP_CO
4c80: 44 45 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  DE are guarantee
4c90: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
4ca0: 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67   ** have non-neg
4cb0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72  ative values for
4cc0: 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   P2. */.        
4cd0: 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c      assert( (sql
4ce0: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
4cf0: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20  ty[pOp->opcode] 
4d00: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
4d10: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
4d20: 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f 70  assert( ADDR(pOp
4d30: 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e 6e 4c  ->p2)<pParse->nL
4d40: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  abel );.        
4d50: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c      pOp->p2 = aL
4d60: 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70  abel[ADDR(pOp->p
4d70: 32 29 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  2)];.          }
4d80: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4da0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65    }.      /* The
4db0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73   mkopcodeh.tcl s
4dc0: 63 72 69 70 74 20 68 61 73 20 73 6f 20 61 72 72  cript has so arr
4dd0: 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74 68 61  anged things tha
4de0: 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20  t the only.     
4df0: 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63   ** non-jump opc
4e00: 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20 53  odes less than S
4e10: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f  QLITE_MX_JUMP_CO
4e20: 44 45 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  DE are guarantee
4e30: 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 68 61  d to.      ** ha
4e40: 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  ve non-negative 
4e50: 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a  values for P2. *
4e60: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
4e70: 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72  (sqlite3OpcodePr
4e80: 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f  operty[pOp->opco
4e90: 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d  de]&OPFLG_JUMP)=
4ea0: 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30  =0 || pOp->p2>=0
4eb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4ec0: 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62   pOp==p->aOp ) b
4ed0: 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b  reak;.    pOp--;
4ee0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4ef0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
4f00: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
4f10: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
4f20: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
4f30: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
4f40: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
4f50: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
4f60: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
4f70: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
4f80: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
4f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4fa0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4fb0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4fc0: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
4fd0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
4fe0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4ff0: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
5000: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
5010: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
5020: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
5030: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65  nOp;.}../*.** Ve
5040: 72 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61  rify that at lea
5050: 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74  st N opcode slot
5060: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
5070: 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20  in p without.** 
5080: 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63  having to malloc
5090: 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20   for more space 
50a0: 28 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d  (except when com
50b0: 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53  piled using.** S
50c0: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
50d0: 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69  OC_STRESS).  Thi
50e0: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
50f0: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
5100: 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20  ng.** to verify 
5110: 74 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c  that certain cal
5120: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
5130: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e  eAddOpList() can
5140: 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64   never.** fail d
5150: 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c  ue to a OOM faul
5160: 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74  t and hence that
5170: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
5180: 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  e from.** sqlite
5190: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
51a0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
51b0: 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  non-NULL..*/.#if
51c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
51d0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
51e0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
51f0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
5200: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
5210: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
5220: 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69  uired(Vdbe *p, i
5230: 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
5240: 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70   p->nOp + N <= p
5250: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
5260: 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oc );.}.#endif..
5270: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
5280: 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  t the VM passed 
5290: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
52a0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ment does not co
52b0: 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52  ntain.** an OP_R
52c0: 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e  esultRow opcode.
52d0: 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28   Fail an assert(
52e0: 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68  ) if it does. Th
52f0: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79  is is used.** by
5300: 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e   code in pragma.
5310: 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  c to ensure that
5320: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
5330: 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a  ion of certain.*
5340: 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72  * pragmas compor
5350: 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67  ts with the flag
5360: 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
5370: 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74  he mkpragmatab.t
5380: 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f  cl.** script..*/
5390: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
53a0: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
53b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
53c0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
53d0: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
53e0: 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
53f0: 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20  tRow(Vdbe *p){. 
5400: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5410: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
5420: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
5430: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
5440: 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b  =OP_ResultRow );
5450: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
5460: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5470: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
5480: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
5490: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
54a0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
54b0: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
54c0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
54d0: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
54e0: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
54f0: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
5500: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
5510: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
5520: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
5530: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
5540: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
5550: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
5560: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
5570: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
5580: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
5590: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
55a0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
55b0: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
55c0: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
55d0: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
55e0: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
55f0: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
5600: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5610: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
5620: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
5630: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
5640: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
5650: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
5660: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
5670: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
5680: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
5690: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
56a0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
56b0: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
56c0: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
56d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
56e0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
56f0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
5700: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
5710: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
5720: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
5730: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
5740: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
5750: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
5760: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
5770: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
5780: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
5790: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
57a0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
57b0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
57c0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
57d0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
57e0: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
57f0: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
5800: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
5810: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
5820: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
5830: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
5840: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
5850: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
5860: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
5870: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
5880: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
5890: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
58a0: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
58b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
58c0: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
58f0: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
5900: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
5910: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5930: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
5940: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
5950: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
5960: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
5970: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
5980: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
5990: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
59a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
59b0: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
59c0: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
59d0: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
59e0: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
59f0: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
5a00: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
5a10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5a20: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5a30: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
5a40: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
5a50: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
5a60: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
5a70: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
5a80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
5a90: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
5aa0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
5ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
5ac0: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
5ad0: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
5ae0: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
5af0: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
5b00: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
5b10: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
5b20: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
5b30: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
5b40: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
5b50: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
5b60: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
5b70: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
5b80: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
5b90: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
5ba0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
5bb0: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
5bc0: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
5bd0: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5be0: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
5bf0: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
5c00: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
5c10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5c20: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5c30: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
5c40: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
5c50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
5c60: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
5c70: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
5c80: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
5c90: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
5ca0: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
5cb0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
5cc0: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
5cd0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5ce0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
5cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5d00: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
5d10: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
5d20: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
5d30: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
5d40: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
5d50: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
5d60: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5d70: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
5d80: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
5d90: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
5da0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
5db0: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
5dc0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
5dd0: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
5de0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
5df0: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
5e00: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e20: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
5e30: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
5e40: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e60: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
5e70: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
5e80: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
5e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5ea0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5eb0: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
5ec0: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
5ed0: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
5ee0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5ef0: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
5f00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
5f10: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f30: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
5f40: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
5f50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5f60: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
5f70: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5f80: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
5f90: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
5fa0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5fb0: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
5fc0: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
5fd0: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
5fe0: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
5ff0: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
6000: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
6010: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
6020: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
6030: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
6040: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
6050: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
6060: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
6070: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
6080: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
6090: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
60a0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
60b0: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
60c0: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
60d0: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
60e0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
60f0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
6100: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
6110: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
6120: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6130: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6140: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
6150: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
6160: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
6170: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
6180: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
6190: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
61a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
61b0: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
61c0: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
61d0: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
61e0: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
61f0: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
6200: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
6210: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6220: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
6230: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
6240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
6250: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
6260: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
6270: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
6280: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
6290: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
62a0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
62b0: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
62c0: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
62d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
62e0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
62f0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
6300: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
6310: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
6320: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
6330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
6340: 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20  e *p, u16 p5){. 
6350: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6360: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
6370: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6380: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e  ( p->nOp>0 ) p->
6390: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
63a0: 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = p5;.}../*.** 
63b0: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
63c0: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
63d0: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
63e0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
63f0: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
6400: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
6410: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
6420: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6430: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
6440: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
6450: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6460: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
6470: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
6480: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
6490: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
64a0: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
64b0: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
64c0: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
64d0: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
64e0: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
64f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
6500: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
6510: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
6520: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
6530: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44  pDef){.  if( (pD
6540: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
6550: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
6560: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
6570: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
6580: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
6590: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
65a0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
65b0: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
65c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
65d0: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
65e0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
65f0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
6600: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65  NE void freeP4Me
6610: 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d  m(sqlite3 *db, M
6620: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
6630: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
6640: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
6650: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c  >zMalloc);.  sql
6660: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
6670: 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51   p);.}.static SQ
6680: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
6690: 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74 78  id freeP4FuncCtx
66a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71  (sqlite3 *db, sq
66b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
66c0: 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72  ){.  freeEphemer
66d0: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  alFunction(db, p
66e0: 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74  ->pFunc);. sqlit
66f0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
6700: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
6710: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
6720: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
6730: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73   void *p4){.  as
6740: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77  sert( db );.  sw
6750: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
6760: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
6770: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  CTX: {.      fre
6780: 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28  eP4FuncCtx(db, (
6790: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
67a0: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
67b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
67c0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63  e P4_REAL:.    c
67d0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
67e0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
67f0: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  C:.    case P4_I
6800: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
6810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6820: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72  b, p4);.      br
6830: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6840: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
6850: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
6860: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
6870: 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ) sqlite3KeyInfo
6880: 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29  Unref((KeyInfo*)
6890: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
68a0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
68b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
68c0: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
68d0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
68e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
68f0: 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a  elete(db, (Expr*
6900: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6910: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6920: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
6930: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  DEF: {.      fre
6940: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
6950: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
6960: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6970: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6980: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
6990: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
69a0: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
69b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
69c0: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
69d0: 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20  alue*)p4);.     
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
69f0: 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d  freeP4Mem(db, (M
6a00: 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d  em*)p4);.      }
6a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6a20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6a30: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69  VTAB : {.      i
6a40: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
6a50: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
6a60: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62  VtabUnlock((VTab
6a70: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  le *)p4);.      
6a80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
6aa0: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
6ab0: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
6ac0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
6ad0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
6ae0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
6af0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
6b00: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
6b10: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
6b20: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
6b30: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
6b40: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
6b50: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
6b60: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
6b70: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
6b80: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
6b90: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 26  p;.    for(pOp=&
6ba0: 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e  aOp[nOp-1]; pOp>
6bb0: 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20  =aOp; pOp--){.  
6bc0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
6bd0: 79 70 65 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49  ype <= P4_FREE_I
6be0: 46 5f 4c 45 20 29 20 66 72 65 65 50 34 28 64 62  F_LE ) freeP4(db
6bf0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
6c00: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
6c10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6c20: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
6c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
6c40: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
6c50: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
6c60: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73      .    }.    s
6c70: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
6c80: 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  b, aOp);.  }.}..
6c90: 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53  /*.** Link the S
6ca0: 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74  ubProgram object
6cb0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
6cc0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6cd0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a  nto the linked.*
6ce0: 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70  * list at Vdbe.p
6cf0: 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73  SubProgram. This
6d00: 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f   list is used to
6d10: 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d   delete all sub-
6d20: 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63  program.** objec
6d30: 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69  ts when the VM i
6d40: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  s no longer requ
6d50: 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ired..*/.void sq
6d60: 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62  lite3VdbeLinkSub
6d70: 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56  Program(Vdbe *pV
6d80: 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20  dbe, SubProgram 
6d90: 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  *p){.  p->pNext 
6da0: 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61  = pVdbe->pProgra
6db0: 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f  m;.  pVdbe->pPro
6dc0: 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  gram = p;.}../*.
6dd0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70  ** Change the op
6de0: 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74  code at addr int
6df0: 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74  o OP_Noop.*/.int
6e00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6e10: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
6e20: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56  , int addr){.  V
6e30: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
6e40: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
6e50: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
6e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
6e70: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
6e80: 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op );.  pOp = &p
6e90: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66  ->aOp[addr];.  f
6ea0: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70  reeP4(p->db, pOp
6eb0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6ec0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74  4.p);.  pOp->p4t
6ed0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
6ee0: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20  ;.  pOp->p4.z = 
6ef0: 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0;.  pOp->opcode
6f00: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65   = OP_Noop;.  re
6f10: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
6f20: 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63   If the last opc
6f30: 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20  ode is "op" and 
6f40: 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70  it is not a jump
6f50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a   destination,.**
6f60: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e   then remove it.
6f70: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
6f80: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20   and only if an 
6f90: 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76  opcode was remov
6fa0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
6fb0: 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f  e3VdbeDeletePrio
6fc0: 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c  rOpcode(Vdbe *p,
6fd0: 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70   u8 op){.  if( p
6fe0: 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f  ->nOp>0 && p->aO
6ff0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f  p[p->nOp-1].opco
7000: 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65  de==op ){.    re
7010: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
7020: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20  ChangeToNoop(p, 
7030: 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c  p->nOp-1);.  }el
7040: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
7050: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
7060: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
7070: 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  of the P4 operan
7080: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
7090: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
70a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
70b0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
70c0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
70d0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
70e0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
70f0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
7100: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
7110: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
7120: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
7130: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
7140: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
7150: 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70  0 then the P4 op
7160: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
7170: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
7180: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
7190: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
71a0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
71b0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
71c0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  _malloc()..** A 
71d0: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
71e0: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
71f0: 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20  f zP4 up to and 
7200: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
7210: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
7220: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
7230: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
7240: 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68   zP4..** .** Oth
7250: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
7260: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f  P4_STATIC, P4_CO
7270: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
7280: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f  cate that zP4 po
7290: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
72a0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
72b0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
72c0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
72d0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
72e0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
72f0: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
7300: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
7310: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
7320: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
7330: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65  change P4 on the
7340: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
7350: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
7360: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
7370: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
7380: 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65 50 34  INE vdbeChangeP4
7390: 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c  Full(.  Vdbe *p,
73a0: 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f  .  Op *pOp,.  co
73b0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20  nst char *zP4,. 
73c0: 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20   int n.){.  if( 
73d0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
73e0: 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c     freeP4(p->db,
73f0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
7400: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f  p->p4.p);.    pO
7410: 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20  p->p4type = 0;. 
7420: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30     pOp->p4.p = 0
7430: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20  ;.  }.  if( n<0 
7440: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7450: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69  beChangeP4(p, (i
7460: 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70  nt)(pOp - p->aOp
7470: 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65  ), zP4, n);.  }e
7480: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
7490: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
74a0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
74b0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
74c0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
74d0: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
74e0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
74f0: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
7500: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
7510: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
7520: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
7530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
7540: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
7550: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
7560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
7570: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
7580: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
7590: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
75a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
75b0: 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20  t( p->aOp!=0 || 
75c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
75d0: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
75e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
75f0: 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42    if( n!=P4_VTAB
7600: 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c   ) freeP4(db, n,
7610: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
7620: 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75  )&zP4);.    retu
7630: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
7640: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
7650: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
7660: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
7670: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
7680: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
7690: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
76a0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e  p[addr];.  if( n
76b0: 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79  >=0 || pOp->p4ty
76c0: 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68  pe ){.    vdbeCh
76d0: 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f  angeP4Full(p, pO
76e0: 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  p, zP4, n);.    
76f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
7700: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
7710: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
7720: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
7730: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
7740: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
7750: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
7760: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
7770: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
7780: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
7790: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
77a0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
77b0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
77c0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
77d0: 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b  se if( zP4!=0 ){
77e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30  .    assert( n<0
77f0: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
7800: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
7810: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
7820: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e  = (signed char)n
7830: 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f  ;.    if( n==P4_
7840: 56 54 41 42 20 29 20 73 71 6c 69 74 65 33 56 74  VTAB ) sqlite3Vt
7850: 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29  abLock((VTable*)
7860: 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  zP4);.  }.}../*.
7870: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 34  ** Change the P4
7880: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
7890: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
78a0: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ded instruction 
78b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65  .** to the value
78c0: 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20   defined by the 
78d0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73  arguments.  This
78e0: 20 69 73 20 61 20 68 69 67 68 2d 73 70 65 65 64   is a high-speed
78f0: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  .** version of s
7900: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7910: 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  P4()..**.** The 
7920: 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20  P4 operand must 
7930: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 70 72  not have been pr
7940: 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64  eviously defined
7950: 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a  .  And the new.*
7960: 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65  * P4 must not be
7970: 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20   P4_INT32.  Use 
7980: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7990: 65 50 34 28 29 20 69 6e 20 65 69 74 68 65 72 20  eP4() in either 
79a0: 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65  of.** those case
79b0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
79c0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 56  e3VdbeAppendP4(V
79d0: 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50  dbe *p, void *pP
79e0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62  4, int n){.  Vdb
79f0: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65  eOp *pOp;.  asse
7a00: 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20  rt( n!=P4_INT32 
7a10: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b  && n!=P4_VTAB );
7a20: 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20  .  assert( n<=0 
7a30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
7a40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7a50: 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62      freeP4(p->db
7a60: 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c  , n, pP4);.  }el
7a70: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7a80: 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  pP4!=0 );.    as
7a90: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
7aa0: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e  ;.    pOp = &p->
7ab0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20  aOp[p->nOp-1];. 
7ac0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
7ad0: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
7ae0: 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  ED );.    pOp->p
7af0: 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70  4type = n;.    p
7b00: 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a  Op->p4.p = pP4;.
7b10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
7b20: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
7b30: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
7b40: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
7b50: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
7b60: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
7b70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b80: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
7b90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7ba0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
7bb0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7bc0: 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e  ->pVdbe;.  KeyIn
7bd0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
7be0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
7bf0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
7c00: 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  0 );.  pKeyInfo 
7c10: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
7c20: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
7c30: 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65  pIdx);.  if( pKe
7c40: 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56  yInfo ) sqlite3V
7c50: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
7c60: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
7c70: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
7c80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
7c90: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
7ca0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7cb0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
7cc0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
7cd0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
7ce0: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
7cf0: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
7d00: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
7d10: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
7d20: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
7d30: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
7d40: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
7d50: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
7d60: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
7d70: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
7d80: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
7d90: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
7da0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
7db0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
7dc0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
7dd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
7de0: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
7df0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7e00: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
7e10: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
7e20: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
7e30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7e40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
7e50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7e60: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
7e70: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
7e80: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
7e90: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
7ea0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
7eb0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
7ec0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
7ed0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
7ee0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
7ef0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
7f00: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
7f10: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
7f20: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
7f30: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
7f40: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
7f50: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
7f60: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
7f70: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
7f80: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
7f90: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7fa0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
7fb0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
7fc0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
7fd0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
7fe0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
7ff0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
8000: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
8010: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
8020: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
8030: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
8040: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
8050: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
8060: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
8070: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
8080: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
8090: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  GE./*.** Set the
80a0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53   value if the iS
80b0: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72  rcLine field for
80c0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
80d0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
80e0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
80f0: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d  e3VdbeSetLineNum
8100: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ber(Vdbe *v, int
8110: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74   iLine){.  sqlit
8120: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31  e3VdbeGetOp(v,-1
8130: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  )->iSrcLine = iL
8140: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ine;.}.#endif /*
8150: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
8160: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ERAGE */../*.** 
8170: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
8180: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
8190: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61  dress.  If the a
81a0: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68  ddress is -1, th
81b0: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
81c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
81d0: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a  nserted opcode..
81e0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
81f0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
8200: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
8210: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  prior to the cal
8220: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ling of this.** 
8230: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20  routine, then a 
8240: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d  pointer to a dum
8250: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62  my VdbeOp will b
8260: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61  e returned.  Tha
8270: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72  t opcode.** is r
8280: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20  eadable but not 
8290: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68  writable, though
82a0: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61   it is cast to a
82b0: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e   writable value.
82c0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f  .** The return o
82d0: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65  f a dummy opcode
82e0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
82f0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
8300: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65  ctioning.** afte
8310: 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77  r an OOM fault w
8320: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
8330: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
8340: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
8350: 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
8360: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
8370: 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75  nter.  But becau
8380: 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63  se the dummy.opc
8390: 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d  ode is 0,.** dum
83a0: 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  my will never be
83b0: 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68   written to.  Th
83c0: 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62  is is verified b
83d0: 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f  y code inspectio
83e0: 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e  n and.** by runn
83f0: 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e  ing with Valgrin
8400: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
8410: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
8420: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
8430: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
8440: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
8450: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
8460: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
8470: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
8480: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
8490: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
84a0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
84b0: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
84c0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
84d0: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
84e0: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
84f0: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
8500: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
8510: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
8520: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
8530: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
8540: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
8550: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
8560: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
8570: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
8580: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
8590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
85a0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
85b0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
85c0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
85d0: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
85e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
85f0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
8600: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
8610: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
8620: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a  AIN_COMMENTS)./*
8630: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  .** Return an in
8640: 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
8650: 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d  one of the param
8660: 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63  eters to the opc
8670: 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72  ode pOp.** deter
8680: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74  mined by charact
8690: 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er c..*/.static 
86a0: 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63  int translateP(c
86b0: 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20  har c, const Op 
86c0: 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d  *pOp){.  if( c==
86d0: 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '1' ) return pOp
86e0: 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p1;.  if( c=='
86f0: 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  2' ) return pOp-
8700: 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33  >p2;.  if( c=='3
8710: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
8720: 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27  p3;.  if( c=='4'
8730: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
8740: 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  4.i;.  return pO
8750: 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->p5;.}../*.** 
8760: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
8770: 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e   for the "commen
8780: 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44  t" field of a VD
8790: 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e  BE opcode listin
87a0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e  g..**.** The Syn
87b0: 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20  opsis: field in 
87c0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
87d0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69  vdbe.c source fi
87e0: 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65  le gets converte
87f0: 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61  d.** to an extra
8800: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
8810: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
8820: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
8830: 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20  e().  In the.** 
8840: 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72  absence of other
8850: 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20   comments, this 
8860: 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73  synopsis becomes
8870: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
8880: 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53  the opcode..** S
8890: 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ome translation 
88a0: 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  occurs:.**.**   
88b0: 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e      "PX"      ->
88c0: 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20    "r[X]".**     
88d0: 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20    "PX@PY"   ->  
88e0: 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f  "r[X..X+Y-1]"  o
88f0: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73  r "r[x]" if y is
8900: 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20   0 or 1.**      
8910: 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22   "PX@PY+1" ->  "
8920: 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72  r[X..X+Y]"    or
8930: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
8940: 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e  0.**       "PY..
8950: 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59  PY"  ->  "r[X..Y
8960: 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d  ]"      or "r[x]
8970: 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61  " if y<=x.*/.sta
8980: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43  tic int displayC
8990: 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20  omment(.  const 
89a0: 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20  Op *pOp,     /* 
89b0: 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65  The opcode to be
89c0: 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   commented */.  
89d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
89e0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79     /* Previously
89f0: 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20   obtained value 
8a00: 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72  for P4 */.  char
8a10: 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f   *zTemp,       /
8a20: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68  * Write result h
8a30: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ere */.  int nTe
8a40: 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  mp          /* S
8a50: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69  pace available i
8a60: 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a  n zTemp[] */.){.
8a70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8a80: 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pName;.  const c
8a90: 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a  har *zSynopsis;.
8aa0: 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20    int nOpName;. 
8ab0: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63   int ii, jj;.  c
8ac0: 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20  har zAlt[50];.  
8ad0: 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  zOpName = sqlite
8ae0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
8af0: 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e  >opcode);.  nOpN
8b00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
8b10: 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a  len30(zOpName);.
8b20: 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f    if( zOpName[nO
8b30: 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20  pName+1] ){.    
8b40: 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b  int seenCom = 0;
8b50: 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20  .    char c;.   
8b60: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70   zSynopsis = zOp
8b70: 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20  Name += nOpName 
8b80: 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72  + 1;.    if( str
8b90: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22  ncmp(zSynopsis,"
8ba0: 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  IF ",3)==0 ){.  
8bb0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
8bc0: 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
8bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8be0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
8bf0: 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c  eof(zAlt), zAlt,
8c00: 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c   "r[P2] = (%s)",
8c10: 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20   zSynopsis+3);. 
8c20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8c40: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74  intf(sizeof(zAlt
8c50: 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20  ), zAlt, "if %s 
8c60: 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70  goto P2", zSynop
8c70: 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a  sis+3);.      }.
8c80: 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20        zSynopsis 
8c90: 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20  = zAlt;.    }.  
8ca0: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
8cb0: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
8cc0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
8cd0: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
8ce0: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
8cf0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
8d00: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
8d10: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
8d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8d30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8d40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
8d50: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
8d60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8d70: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
8d80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8d90: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8da0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
8db0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
8dc0: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
8dd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8de0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
8df0: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
8e00: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
8e10: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
8e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8e30: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8e40: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
8e50: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
8e60: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
8e70: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
8e80: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
8e90: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
8ea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
8eb0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8ec0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
8ed0: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
8ee0: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
8ef0: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8f10: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
8f20: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
8f30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8f40: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
8f50: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8f70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
8f80: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
8f90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8fa0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8fb0: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
8fc0: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
8fd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8fe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8ff0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
9000: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
9010: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
9020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9030: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
9040: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
9050: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
9060: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
9070: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
9080: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
9090: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
90a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
90b0: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
90c0: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
90d0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
90e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
90f0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
9100: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
9110: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
9120: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
9130: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
9140: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
9150: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
9160: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
9170: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
9180: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
9190: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
91a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
91b0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
91c0: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
91d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
91e0: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
91f0: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
9200: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
9210: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
9220: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9230: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
9240: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
9250: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9260: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
9270: 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72  _HINTS)./*.** Tr
9280: 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70  anslate the P4.p
9290: 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61  Expr value for a
92a0: 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20  n OP_CursorHint 
92b0: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74  opcode into text
92c0: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
92d0: 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65  displayed in the
92e0: 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58   P4 column of EX
92f0: 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f  PLAIN output..*/
9300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
9310: 70 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63  playP4Expr(StrAc
9320: 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45  cum *p, Expr *pE
9330: 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  xpr){.  const ch
9340: 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73  ar *zOp = 0;.  s
9350: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
9360: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9370: 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71  STRING:.      sq
9380: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9390: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
93a0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
93b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
93c0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
93d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
93e0: 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
93f0: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
9400: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9410: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73  TK_NULL:.      s
9420: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9430: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
9440: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9450: 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
9460: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9470: 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20  ntf(p, "r[%d]", 
9480: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
9490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
94a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
94b0: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
94c0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
94d0: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n<0 ){.        s
94e0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
94f0: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
9500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9510: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
9520: 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45  , "c%d", (int)pE
9530: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
9540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9560: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
9570: 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20  Op = "LT";      
9580: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9590: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LE:      zOp 
95a0: 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65  = "LE";      bre
95b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
95c0: 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GT:      zOp = "
95d0: 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GT";      break;
95e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
95f0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22        zOp = "GE"
9600: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9610: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
9620: 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20     zOp = "NE";  
9630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9640: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
9650: 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  zOp = "EQ";     
9660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9670: 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70   TK_IS:      zOp
9680: 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72   = "IS";      br
9690: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
96a0: 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20  _ISNOT:   zOp = 
96b0: 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b  "ISNOT";   break
96c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
96d0: 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e  D:     zOp = "AN
96e0: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
96f0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
9700: 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20      zOp = "OR"; 
9710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9720: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
9730: 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20   zOp = "ADD";   
9740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9750: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f  e TK_STAR:    zO
9760: 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62  p = "MUL";     b
9770: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9780: 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d  K_MINUS:   zOp =
9790: 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61   "SUB";     brea
97a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
97b0: 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52  EM:     zOp = "R
97c0: 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EM";     break;.
97d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
97e0: 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41  ND:  zOp = "BITA
97f0: 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ND";  break;.   
9800: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
9810: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b    zOp = "BITOR";
9820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9830: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
9840: 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20  Op = "DIV";     
9850: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9860: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_LSHIFT:  zOp 
9870: 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65  = "LSHIFT";  bre
9880: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9890: 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  RSHIFT:  zOp = "
98a0: 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  RSHIFT";  break;
98b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
98c0: 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e  CAT:  zOp = "CON
98d0: 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  CAT";  break;.  
98e0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
98f0: 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22  :  zOp = "MINUS"
9900: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9910: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
9920: 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20  zOp = "PLUS";   
9930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9940: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70   TK_BITNOT:  zOp
9950: 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72   = "BITNOT";  br
9960: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9970: 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _NOT:     zOp = 
9980: 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  "NOT";     break
9990: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
99a0: 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53  NULL:  zOp = "IS
99b0: 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NULL";  break;. 
99c0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
99d0: 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55  LL: zOp = "NOTNU
99e0: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
99f0: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
9a00: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
9a10: 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b  , "%s", "expr");
9a20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9a30: 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a  }..  if( zOp ){.
9a40: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9a50: 74 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70  tf(p, "%s(", zOp
9a60: 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34  );.    displayP4
9a70: 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70  Expr(p, pExpr->p
9a80: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Left);.    if( p
9a90: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
9aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
9ab0: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22  AccumAppend(p, "
9ac0: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
9ad0: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
9ae0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9af0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9b00: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
9b10: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , ")", 1);.  }.}
9b20: 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f  .#endif /* VDBE_
9b30: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
9b40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9b50: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
9b60: 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f  ) */...#if VDBE_
9b70: 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a  DISPLAY_P4./*.**
9b80: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
9b90: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
9ba0: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
9bb0: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
9bc0: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
9bd0: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
9be0: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
9bf0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
9c00: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
9c10: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
9c20: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
9c30: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
9c40: 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63   zTemp;.  StrAcc
9c50: 75 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20  um x;.  assert( 
9c60: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
9c70: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
9c80: 69 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c  it(&x, 0, zTemp,
9c90: 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77   nTemp, 0);.  sw
9ca0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
9cb0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
9cc0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
9cd0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b    int j;.      K
9ce0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
9cf0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
9d00: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
9d10: 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
9d20: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
9d30: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9d40: 74 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70  tf(&x, "k(%d", p
9d50: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
9d60: 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ld);.      for(j
9d70: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
9d80: 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  nKeyField; j++){
9d90: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
9da0: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
9db0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
9dc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
9dd0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
9de0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
9df0: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28   "";.        if(
9e00: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22   strcmp(zColl, "
9e10: 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43  BINARY")==0 ) zC
9e20: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
9e30: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9e40: 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 70  f(&x, ",%s%s", p
9e50: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
9e60: 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22  der[j] ? "-" : "
9e70: 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ", zColl);.     
9e80: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9e90: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
9ea0: 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20  x, ")", 1);.    
9eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9ec0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
9ed0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
9ee0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
9ef0: 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c  R: {.      displ
9f00: 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70  ayP4Expr(&x, pOp
9f10: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20  ->p4.pExpr);.   
9f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9f30: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9f40: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
9f50: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9f60: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
9f70: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
9f80: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28 25  3XPrintf(&x, "(%
9f90: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
9fa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
9fb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9fc0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
9fd0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
9fe0: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
9ff0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
a000: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a010: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
a020: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
a030: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a040: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
a050: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
a060: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
a070: 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73  PROFILE).    cas
a080: 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a  e P4_FUNCCTX: {.
a090: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
a0a0: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  Def = pOp->p4.pC
a0b0: 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20  tx->pFunc;.     
a0c0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a0d0: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
a0e0: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
a0f0: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
a100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
a110: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
a120: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
a130: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a140: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
a150: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
a160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a170: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
a180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a190: 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c 20 70  intf(&x, "%d", p
a1a0: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
a1b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a1c0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
a1d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
a1e0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36  Printf(&x, "%.16
a1f0: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
a200: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
a210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a220: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
a230: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
a240: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
a250: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
a260: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
a270: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
a280: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
a290: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
a2a0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
a2b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a2c0: 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c  intf(&x, "%lld",
a2d0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
a2e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
a2f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
a300: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
a310: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
a320: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
a330: 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
a340: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
a350: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
a360: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
a370: 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c  NULL";.      }el
a380: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
a390: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
a3a0: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
a3b0: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
a3c0: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
a3d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a3e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a3f0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
a400: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
a410: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
a420: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
a430: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
a440: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
a450: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
a460: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
a470: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
a480: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
a490: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
a4a0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AY: {.      int 
a4b0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69  i;.      int *ai
a4c0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
a4d0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b       int n = ai[
a4e0: 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  0];   /* The fir
a4f0: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e  st element of an
a500: 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77   INTARRAY is alw
a510: 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ays the.        
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
a530: 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * count of the n
a540: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
a550: 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
a560: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
a570: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
a580: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a590: 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d  &x, ",%d", ai[i]
a5a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a5b0: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b   zTemp[0] = '[';
a5c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
a5d0: 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c  rAccumAppend(&x,
a5e0: 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   "]", 1);.      
a5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a600: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
a610: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
a620: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a630: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
a640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a650: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
a660: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
a670: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
a680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a690: 20 63 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20   case P4_TABLE: 
a6a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
a6b0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 22 2c  Printf(&x, "%s",
a6c0: 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a   pOp->p4.pTab->z
a6d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
a6e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
a6f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
a700: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
a710: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
a720: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
a730: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
a740: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
a750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a760: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
a770: 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20  umFinish(&x);.  
a780: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
a790: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
a7a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
a7b0: 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a  _DISPLAY_P4 */..
a7c0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
a7d0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
a7e0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
a7f0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
a800: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
a810: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
a820: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
a830: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
a840: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
a850: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
a860: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
a870: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
a880: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
a890: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
a8a0: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
a8b0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
a8c0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
a8d0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
a8e0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
a8f0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
a900: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
a910: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
a920: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
a930: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
a940: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
a950: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
a960: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
a970: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
a980: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
a990: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
a9a0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
a9b0: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
a9c0: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
a9d0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
a9e0: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
a9f0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
aa00: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
aa10: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
aa20: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
aa30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
aa40: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a  T_SHARED_CACHE).
aa50: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
aa60: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
aa70: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
aa80: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
aa90: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
aaa0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
aab0: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
aac0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
aad0: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
aae0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
aaf0: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
ab00: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
ab10: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
ab20: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
ab30: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
ab40: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
ab50: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
ab60: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
ab70: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
ab80: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
ab90: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
aba0: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
abb0: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
abc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
abd0: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
abe0: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
abf0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
ac00: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
ac10: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
ac20: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
ac30: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
ac40: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
ac50: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
ac60: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
ac70: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
ac80: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
ac90: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
aca0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
acb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
acc0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
acd0: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
ace0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
acf0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
ad00: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
ad10: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
ad20: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
ad30: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
ad40: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
ad50: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
ad60: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
ad70: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
ad80: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
ad90: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
ada0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
adb0: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
adc0: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
add0: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
ade0: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
adf0: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
ae00: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
ae10: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
ae20: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
ae30: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
ae40: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
ae50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ae60: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
ae70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
ae80: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
ae90: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
aea0: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
aeb0: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
aec0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
aed0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
aee0: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
aef0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
af00: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
af10: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
af20: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
af30: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
af40: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
af50: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
af60: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
af70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
af80: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
af90: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
afa0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
afb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
afc0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
afd0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
afe0: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
aff0: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
b000: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
b010: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
b020: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
b030: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61  eEnter()..*/.sta
b040: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
b050: 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61  INE void vdbeLea
b060: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
b070: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
b080: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
b090: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20    int nDb;.  db 
b0a0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
b0b0: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
b0c0: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
b0d0: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
b0e0: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
b0f0: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
b100: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
b110: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
b120: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
b130: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
b140: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
b150: 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73    }.  }.}.void s
b160: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
b170: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
b180: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
b190: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
b1a0: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
b1b0: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64  mon case */.  vd
b1c0: 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65  beLeave(p);.}.#e
b1d0: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
b1e0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
b1f0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
b200: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
b210: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
b220: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
b230: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
b240: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
b250: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
b260: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
b270: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
b280: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
b290: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
b2a0: 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43  r[50];.  char zC
b2b0: 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  om[100];.  stati
b2c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  c const char *zF
b2d0: 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d  ormat1 = "%4d %-
b2e0: 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20  13s %4d %4d %4d 
b2f0: 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22  %-13s %.2X %s\n"
b300: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
b310: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
b320: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
b330: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
b340: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66  zeof(zPtr));.#if
b350: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b360: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
b370: 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d  TS.  displayComm
b380: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43  ent(pOp, zP4, zC
b390: 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29  om, sizeof(zCom)
b3a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b  );.#else.  zCom[
b3b0: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
b3c0: 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c   /* NB:  The sql
b3d0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
b3e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
b3f0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65  lemented by code
b400: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79   created.  ** by
b410: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61   the mkopcodeh.a
b420: 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63  wk and mkopcodec
b430: 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69  .awk scripts whi
b440: 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20  ch extract the. 
b450: 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
b460: 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20  from the vdbe.c 
b470: 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20  source text */. 
b480: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
b490: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
b4a0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
b4b0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
b4c0: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
b4d0: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
b4e0: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20  P4, pOp->p5,.   
b4f0: 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66     zCom.  );.  f
b500: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
b510: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
b520: 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79  tialize an array
b530: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
b540: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b550: 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d  d initMemArray(M
b560: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71  em *p, int N, sq
b570: 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66  lite3 *db, u16 f
b580: 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20  lags){.  while( 
b590: 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70  (N--)>0 ){.    p
b5a0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70  ->db = db;.    p
b5b0: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
b5c0: 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63  .    p->szMalloc
b5d0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
b5e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d  ITE_DEBUG.    p-
b5f0: 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b  >pScopyFrom = 0;
b600: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b  .#endif.    p++;
b610: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
b620: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
b630: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
b640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b650: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
b660: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
b670: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
b680: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
b690: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
b6a0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
b6b0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
b6c0: 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20  tesFreed ){.    
b6d0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
b6e0: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20  ( p->szMalloc ) 
b6f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
b700: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
b710: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b       }while( (++
b720: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  p)<pEnd );.     
b730: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
b740: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73     do{.      ass
b750: 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45  ert( (&p[1])==pE
b760: 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70  nd || p[0].db==p
b770: 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20  [1].db );.      
b780: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
b790: 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
b7a0: 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20  iants(p) );..   
b7b0: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
b7c0: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e   is really an in
b7d0: 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  lined version of
b7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
b7f0: 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a  elease().      *
b800: 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76  * that takes adv
b810: 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61  antage of the fa
b820: 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f  ct that the memo
b830: 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73  ry cell value is
b840: 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67   .      ** being
b850: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74   set to NULL aft
b860: 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79  er releasing any
b870: 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63   dynamic resourc
b880: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
b890: 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66     ** The justif
b8a0: 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  ication for dupl
b8b0: 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20  icating code is 
b8c0: 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74  that according t
b8d0: 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  o .      ** call
b8e0: 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73  grind, this caus
b8f0: 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73  es a certain tes
b900: 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68  t case to hit th
b910: 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20  e CPU 4.7 .     
b920: 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73   ** percent less
b930: 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63   (x86 linux, gcc
b940: 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20   version 4.1.2, 
b950: 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20  -O6) than if .  
b960: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65      ** sqlite3Me
b970: 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20  mRelease() were 
b980: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65  called from here
b990: 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73  . With -O2, this
b9a0: 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20   jumps.      ** 
b9b0: 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20  to 6.6 percent. 
b9c0: 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73  The test case is
b9d0: 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20   inserting 1000 
b9e0: 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c  rows into a tabl
b9f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  e .      ** with
ba00: 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e   no indexes usin
ba10: 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61  g a single prepa
ba20: 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  red INSERT state
ba30: 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20  ment, bind() .  
ba40: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
ba50: 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20  (). Inserts are 
ba60: 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74  grouped into a t
ba70: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
ba80: 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63    */.      testc
ba90: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
baa0: 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20  MEM_Agg );.     
bab0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
bac0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b  ags & MEM_Dyn );
bad0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bae0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
baf0: 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74  Frame );.      t
bb00: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
bb10: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
bb20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
bb30: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
bb40: 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c  M_Dyn|MEM_Frame|
bb50: 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20  MEM_RowSet) ){. 
bb60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bb70: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b  beMemRelease(p);
bb80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
bb90: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a   p->szMalloc ){.
bba0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
bbb0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a  bFreeNN(db, p->z
bbc0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
bbd0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
bbe0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bbf0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
bc00: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
bc10: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
bc20: 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  d );.  }.}../*.*
bc30: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
bc40: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
bc50: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
bc60: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
bc70: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
bc80: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
bc90: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
bca0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
bcb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bcc0: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
bcd0: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
bce0: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
bcf0: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
bd00: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
bd10: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
bd20: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
bd30: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
bd40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
bd50: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
bd60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bd70: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
bd80: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
bd90: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
bda0: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
bdb0: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
bdc0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
bdd0: 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d  ta(p->v->db, &p-
bde0: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
bdf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
be00: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
be10: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
be20: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
be30: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
be40: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
be50: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
be60: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
be70: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
be80: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
be90: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
bea0: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
beb0: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
bec0: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
bed0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
bee0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
bef0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
bf00: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
bf10: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
bf20: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
bf30: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
bf40: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
bf50: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
bf60: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
bf70: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
bf80: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
bf90: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
bfa0: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
bfb0: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
bfc0: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
bfd0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
bfe0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
bff0: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
c000: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57  RY PLAN..**.** W
c010: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
c020: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
c030: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
c040: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
c050: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
c060: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
c070: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
c080: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
c090: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
c0a0: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
c0b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
c0c0: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
c0d0: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
c100: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
c110: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
c120: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c140: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
c150: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
c160: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
c170: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
c180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c190: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
c1a0: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
c1b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
c1d0: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
c1e0: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
c1f0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
c200: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
c210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c220: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
c230: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
c240: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c270: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c280: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c2a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
c2b0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
c2c0: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
c2d0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
c2e0: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
c2f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
c300: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
c310: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
c320: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
c330: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
c340: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
c350: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
c360: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
c370: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
c380: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
c390: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
c3a0: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
c3b0: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
c3c0: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
c3d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
c3e0: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
c3f0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
c400: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
c410: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
c420: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
c430: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
c440: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
c450: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
c460: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52  Mem, 8);.  p->pR
c470: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20  esultSet = 0;.. 
c480: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c490: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b  TE_NOMEM_BKPT ){
c4a0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
c4b0: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
c4c0: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
c4d0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
c4e0: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
c4f0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
c500: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
c510: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ed.  */.    sqli
c520: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
c530: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c540: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
c550: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
c560: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
c570: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
c580: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
c590: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
c5a0: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
c5b0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
c5c0: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
c5d0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
c5e0: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
c5f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
c600: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
c610: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
c620: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
c630: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c640: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
c650: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
c660: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
c670: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
c680: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
c690: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
c6a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
c6b0: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
c6c0: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
c6d0: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
c6e0: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
c6f0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
c700: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
c710: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
c720: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
c730: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
c740: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
c750: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
c760: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
c770: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
c780: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
c790: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
c7a0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
c7b0: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
c7c0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
c7d0: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
c7e0: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
c7f0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
c800: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
c810: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
c820: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
c830: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
c840: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
c850: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
c860: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
c870: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
c880: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
c890: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
c8a0: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
c8b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
c8c0: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
c8d0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
c8e0: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
c8f0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
c900: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
c910: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
c920: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
c930: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
c940: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
c950: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
c960: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
c970: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
c980: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
c990: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
c9a0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
c9b0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
c9c0: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
c9d0: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
c9e0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
c9f0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
ca00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
ca10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
ca20: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
ca30: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
ca40: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
ca50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
ca60: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
ca70: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ca80: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
ca90: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
caa0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
cab0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
cac0: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
cad0: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
cae0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
caf0: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
cb00: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
cb10: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
cb20: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
cb30: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
cb40: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
cb50: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
cb60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb70: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
cb80: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
cb90: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
cba0: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
cbb0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
cbc0: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
cbd0: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
cbe0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
cbf0: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
cc00: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
cc10: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
cc20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
cc30: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
cc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cc50: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
cc60: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
cc70: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
cc80: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
cc90: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
cca0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
ccb0: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
cce0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
ccf0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
cd00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
cd10: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
cd20: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
cd30: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
cd40: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
cd50: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
cd60: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
cd70: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
cd80: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
cd90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
cda0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
cdb0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
cdc0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
cdd0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
cde0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
cdf0: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
ce00: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
ce10: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
ce20: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
ce30: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
ce40: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
ce50: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
ce60: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
ce70: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
ce80: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
ce90: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
cea0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
ceb0: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
cec0: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
ced0: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
cee0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
cef0: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
cf00: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
cf10: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
cf20: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
cf30: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
cf40: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
cf50: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
cf60: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
cf70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
cf80: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
cf90: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
cfa0: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
cfb0: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
cfc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
cfd0: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
cfe0: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
cff0: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
d000: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
d010: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
d020: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
d030: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
d040: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
d050: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
d060: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
d070: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
d080: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
d090: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
d0a0: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
d0b0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
d0c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d0d0: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
d0e0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
d0f0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
d100: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
d130: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
d140: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
d150: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
d160: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
d190: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
d1a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
d1b0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
d1c0: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
d1f0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
d200: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
d210: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
d220: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
d230: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
d240: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
d250: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
d260: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d270: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
d280: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
d290: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
d2a0: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
d2b0: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
d2c0: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
d2d0: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  oc);.    if( zP4
d2e0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
d2f0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a     pMem->n = 0;.
d300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d310: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
d320: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
d330: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
d340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
d350: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
d360: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
d370: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d380: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
d390: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
d3a0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
d3b0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
d3c0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
d3d0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
d3e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
d3f0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
d400: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
d410: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
d420: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d430: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d440: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d450: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
d460: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
d470: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
d480: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
d490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
d4a0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
d4b0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
d4c0: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
d4d0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
d4e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
d4f0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
d500: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d510: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
d520: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
d530: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
d540: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
d550: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
d560: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
d570: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d580: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d590: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d5a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
d5b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
d5c0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
d5d0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
d5e0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
d5f0: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
d600: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
d610: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
d620: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
d630: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
d640: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d660: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
d670: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
d680: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
d690: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
d6a0: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
d6b0: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
d6c0: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
d6d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
d6e0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
d6f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d700: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d710: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
d720: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
d730: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
d740: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
d750: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
d760: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
d770: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
d780: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
d790: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
d7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
d7b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
d7c0: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
d7d0: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
d7e0: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
d7f0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
d800: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
d810: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
d820: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
d830: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
d840: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
d850: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
d860: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
d870: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
d880: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
d890: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
d8a0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
d8b0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
d8c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
d8d0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
d8e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
d8f0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
d900: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
d910: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
d920: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
d930: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
d940: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
d950: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
d960: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
d970: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
d980: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
d990: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
d9a0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
d9b0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
d9c0: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
d9d0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
d9e0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
d9f0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
da00: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
da10: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
da20: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
da30: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
da40: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
da50: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
da60: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
da70: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
da80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
da90: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
daa0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
dab0: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
dac0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
dad0: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
dae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
daf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
db00: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
db10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
db20: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
db30: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
db40: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
db50: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
db60: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
db70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
db80: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20  TRACE */../* An 
db90: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
dba0: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
dbb0: 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  s bulk memory av
dbc0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a  ailable for use.
dbd0: 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65  ** by subcompone
dbe0: 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65  nts of a prepare
dbf0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70  d statement.  Sp
dc00: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
dc10: 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75   out.** of a Reu
dc20: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
dc30: 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70  t by the allocSp
dc40: 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ace() routine be
dc50: 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  low..*/.struct R
dc60: 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20  eusableSpace {. 
dc70: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
dc80: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
dc90: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
dca0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
dcb0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
dcc0: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
dcd0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65   */.  int nNeede
dce0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  d;         /* To
dcf0: 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63  tal bytes that c
dd00: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
dd10: 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  cated */.};../* 
dd20: 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  Try to allocate 
dd30: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38  nByte bytes of 8
dd40: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75  -byte aligned bu
dd50: 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42  lk memory for pB
dd60: 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52  uf.** from the R
dd70: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
dd80: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
dd90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
dda0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72  located.** memor
ddb0: 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  y on success.  I
ddc0: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d  f insufficient m
ddd0: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
dde0: 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75  le in the.** Reu
ddf0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
de00: 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
de10: 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e  ReusableSpace.nN
de20: 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62  eeded.** value b
de30: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65  y the amount nee
de40: 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ded and return N
de50: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ULL..**.** If pB
de60: 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  uf is not initia
de70: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d  lly NULL, that m
de80: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65  eans that the me
de90: 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  mory has already
dea0: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
deb0: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
dec0: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
ded0: 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ne, so just retu
dee0: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
def0: 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52  pBuf and leave R
df00: 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63  eusableSpace unc
df10: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
df20: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  is allocator is 
df30: 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75  employed to repu
df40: 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f  rpose unused slo
df50: 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ts at the end of
df60: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61   the.** opcode a
df70: 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64  rray of prepared
df80: 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72   state for other
df90: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66   memory needs of
dfa0: 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a   the prepared.**
dfb0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
dfc0: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
dfd0: 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74  cSpace(.  struct
dfe0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a   ReusableSpace *
dff0: 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f  p,  /* Bulk memo
e000: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
e010: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
e020: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
e030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
e040: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72  inter to a prior
e050: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
e060: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
e070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e080: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  tes of memory ne
e090: 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  eded */.){.  ass
e0a0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
e0b0: 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70  ALIGNMENT(p->pSp
e0c0: 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42  ace) );.  if( pB
e0d0: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  uf==0 ){.    nBy
e0e0: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
e0f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
e100: 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b  e <= p->nFree ){
e110: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20  .      p->nFree 
e120: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  -= nByte;.      
e130: 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63  pBuf = &p->pSpac
e140: 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20  e[p->nFree];.   
e150: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
e160: 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  >nNeeded += nByt
e170: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
e180: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
e190: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
e1a0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
e1b0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
e1c0: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
e1d0: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
e1e0: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
e1f0: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
e200: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
e210: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
e220: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
e230: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
e240: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
e250: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
e260: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
e270: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
e280: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
e290: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
e2a0: 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  T || p->magic==V
e2b0: 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20  DBE_MAGIC_RESET 
e2c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
e2d0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
e2e0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
e2f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
e300: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
e310: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
e320: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
e330: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
e340: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
e350: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
e360: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
e370: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
e380: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
e390: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
e3a0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
e3b0: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
e3c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
e3d0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
e3e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
e3f0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
e400: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43  E_Abort;.  p->nC
e410: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
e420: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
e430: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
e440: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
e450: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
e460: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
e470: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
e480: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
e490: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
e4a0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
e4b0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
e4c0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
e4d0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
e4e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
e4f0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
e500: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
e510: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
e520: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
e530: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
e540: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
e550: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
e560: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
e570: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69   allocating regi
e580: 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61  sters and initia
e590: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
e5a0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
e5b0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
e5c0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
e5d0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
e5e0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
e5f0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
e600: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
e610: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e620: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
e630: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ed exactly once 
e640: 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20  on each virtual 
e650: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
e660: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
e670: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
e680: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
e690: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
e6a0: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
e6b0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
e6c0: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68  is called, furth
e6d0: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
e6e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e6f0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
e700: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
e710: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
e720: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
e730: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
e740: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
e750: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
e760: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
e770: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
e780: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
e790: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
e7a0: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
e7b0: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
e7c0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
e7d0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
e7e0: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
e7f0: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
e800: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
e810: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
e820: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
e830: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
e840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
e850: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
e860: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e880: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
e890: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e8c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e8d0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
e8e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
e8f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e900: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e930: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
e940: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
e970: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
e980: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
e990: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
e9a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e9b0: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
e9c0: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
e9d0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
e9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e9f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ea00: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
ea10: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ea40: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52  er */.  struct R
ea50: 65 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20  eusableSpace x; 
ea60: 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62         /* Reusab
ea70: 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a  le bulk memory *
ea80: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
ea90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
eaa0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
eab0: 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
eac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
ead0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
eae0: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
eaf0: 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
eb00: 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
eb10: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
eb20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
eb30: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
eb40: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
eb50: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
eb60: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
eb70: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
eb80: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
eb90: 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a  nMaxArg;.  .  /*
eba0: 20 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65   Each cursor use
ebb0: 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  s a memory cell.
ebc0: 20 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73    The first curs
ebd0: 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61  or (cursor 0) ca
ebe0: 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b  n.  ** use aMem[
ebf0: 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  0] which is not 
ec00: 6f 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62  otherwise used b
ec10: 79 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  y the VDBE progr
ec20: 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20  am.  Allocate.  
ec30: 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ** space at the 
ec40: 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f  end of aMem[] fo
ec50: 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20  r cursors 1 and 
ec60: 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65  greater..  ** Se
ec70: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
ec80: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
ec90: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
eca0: 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d  ;.  if( nCursor=
ecb0: 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e  =0 && nMem>0 ) n
ecc0: 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65  Mem++;  /* Space
ecd0: 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65   for aMem[0] eve
ece0: 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f  n if not used */
ecf0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
ed00: 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61  t how much reusa
ed10: 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ble memory is av
ed20: 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65  ailable at the e
ed30: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  nd of the.  ** o
ed40: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
ed50: 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  is extra memory 
ed60: 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61  will be realloca
ed70: 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c  ted for other el
ed80: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ements.  ** of t
ed90: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
eda0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20  ement..  */.  n 
edb0: 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
edc0: 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20  Op)*p->nOp);    
edd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
ede0: 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d  es of opcode mem
edf0: 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e  ory used */.  x.
ee00: 70 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29  pSpace = &((u8*)
ee10: 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20  p->aOp)[n];     
ee20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
ee30: 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72  sed opcode memor
ee40: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  y */.  assert( E
ee50: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
ee60: 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b  ENT(x.pSpace) );
ee70: 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55  .  x.nFree = ROU
ee80: 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e  NDDOWN8(pParse->
ee90: 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20  szOpAlloc - n); 
eea0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75   /* Bytes of unu
eeb0: 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  sed memory */.  
eec0: 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e  assert( x.nFree>
eed0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
eee0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
eef0: 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78  MENT(&x.pSpace[x
ef00: 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72  .nFree]) );..  r
ef10: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
ef20: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
ef30: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
ef40: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
ef50: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
ef60: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
ef70: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
ef80: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
ef90: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
efa0: 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70  10;.  }.  p->exp
efb0: 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ired = 0;..  /* 
efc0: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
efd0: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
efe0: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
eff0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f  s allocated in o
f000: 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70  ne or two.  ** p
f010: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
f020: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
f030: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
f040: 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  d memory at the 
f050: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
f060: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
f070: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
f080: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
f090: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
f0a0: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
f0b0: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
f0c0: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
f0d0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
f0e0: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
f0f0: 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  n the remainder 
f100: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65  using a fresh me
f110: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
f120: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
f130: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
f140: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
f150: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
f160: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
f170: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
f180: 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20  r memory at the 
f190: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
f1a0: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63  e array.  This c
f1b0: 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  an significantly
f1c0: 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65  .  ** reduce the
f1d0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72   amount of memor
f1e0: 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70  y held by a prep
f1f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
f200: 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20    */.  do {.    
f210: 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  x.nNeeded = 0;. 
f220: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
f230: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
f240: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
f250: 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
f260: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
f270: 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56  (&x, p->aVar, nV
f280: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  ar*sizeof(Mem));
f290: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
f2a0: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
f2b0: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
f2c0: 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20  zeof(Mem*));.   
f2d0: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
f2e0: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
f2f0: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
f300: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
f310: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f320: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
f330: 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61  NSTATUS.    p->a
f340: 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
f350: 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63  ce(&x, p->anExec
f360: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
f370: 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
f380: 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d    if( x.nNeeded=
f390: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f3a0: 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46  x.pSpace = p->pF
f3b0: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
f3c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78  allocRawNN(db, x
f3d0: 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78  .nNeeded);.    x
f3e0: 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64  .nFree = x.nNeed
f3f0: 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64  ed;.  }while( !d
f400: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f410: 29 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20  );..  p->pVList 
f420: 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74  = pParse->pVList
f430: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69  ;.  pParse->pVLi
f440: 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78  st =  0;.  p->ex
f450: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
f460: 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64  explain;.  if( d
f470: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f480: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
f490: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73   0;.    p->nCurs
f4a0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  or = 0;.    p->n
f4b0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Mem = 0;.  }else
f4c0: 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  {.    p->nCursor
f4d0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20   = nCursor;.    
f4e0: 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
f4f0: 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d  )nVar;.    initM
f500: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
f510: 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e   nVar, db, MEM_N
f520: 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65  ull);.    p->nMe
f530: 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  m = nMem;.    in
f540: 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  itMemArray(p->aM
f550: 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45  em, nMem, db, ME
f560: 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20  M_Undefined);.  
f570: 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73    memset(p->apCs
f580: 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69  r, 0, nCursor*si
f590: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
f5a0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
f5b0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
f5c0: 41 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d  ANSTATUS.    mem
f5d0: 73 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30  set(p->anExec, 0
f5e0: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
f5f0: 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
f600: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
f610: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
f620: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
f630: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
f640: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
f650: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
f660: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
f670: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
f680: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
f690: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
f6a0: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
f6b0: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
f6c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f6d0: 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42   assert( pCx->pB
f6e0: 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43  tx==0 || pCx->eC
f6f0: 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
f700: 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63  BTREE );.  switc
f710: 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  h( pCx->eCurType
f720: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52   ){.    case CUR
f730: 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20  TYPE_SORTER: {. 
f740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f750: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
f760: 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62  b, pCx);.      b
f770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f780: 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52  case CURTYPE_BTR
f790: 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EE: {.      if( 
f7a0: 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c  pCx->isEphemeral
f7b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f7c0: 70 43 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69  pCx->pBtx ) sqli
f7d0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
f7e0: 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20  x->pBtx);.      
f7f0: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
f800: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
f810: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
f820: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
f830: 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   by.        ** t
f840: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
f850: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
f860: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f870: 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  Cx->uc.pCursor!=
f880: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
f890: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
f8a0: 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75  rsor(pCx->uc.pCu
f8b0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
f8c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f8d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
f8e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f8f0: 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  LE.    case CURT
f900: 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20  YPE_VTAB: {.    
f910: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
f920: 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70  ursor *pVCur = p
f930: 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20  Cx->uc.pVCur;.  
f940: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
f950: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
f960: 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62  e = pVCur->pVtab
f970: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20  ->pModule;.     
f980: 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e   assert( pVCur->
f990: 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b  pVtab->nRef>0 );
f9a0: 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56  .      pVCur->pV
f9b0: 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
f9c0: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
f9d0: 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20  se(pVCur);.     
f9e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f9f0: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
fa00: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
fa10: 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  ors in the curre
fa20: 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61  nt frame..*/.sta
fa30: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75  tic void closeCu
fa40: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62  rsorsInFrame(Vdb
fa50: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
fa60: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
fa70: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
fa80: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
fa90: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
faa0: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
fab0: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
fac0: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
fae0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
faf0: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
fb00: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
fb10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
fb20: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
fb30: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
fb40: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
fb50: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
fb60: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
fb70: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
fb80: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
fb90: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
fba0: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
fbb0: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
fbc0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
fbd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
fbe0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
fbf0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
fc00: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
fc10: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73  Frame->v;.  clos
fc20: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
fc30: 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v);.#ifdef SQLIT
fc40: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
fc50: 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
fc60: 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
fc70: 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
fc80: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
fc90: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
fca0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
fcb0: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
fcc0: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
fcd0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
fce0: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
fcf0: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
fd00: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
fd10: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
fd20: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
fd30: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
fd40: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
fd50: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
fd60: 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e  ange;.  v->db->n
fd70: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
fd80: 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71  >nDbChange;.  sq
fd90: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
fda0: 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76  uxData(v->db, &v
fdb0: 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
fdc0: 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74  0);.  v->pAuxDat
fdd0: 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  a = pFrame->pAux
fde0: 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  Data;.  pFrame->
fdf0: 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20  pAuxData = 0;.  
fe00: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
fe10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
fe20: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
fe30: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
fe40: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
fe50: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
fe60: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
fe70: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
fe80: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
fe90: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
fea0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
feb0: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
fec0: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
fed0: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
fee0: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
fef0: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
ff00: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
ff10: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
ff20: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
ff30: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
ff40: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
ff50: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
ff60: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
ff70: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
ff80: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
ff90: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
ffa0: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
ffb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ffc0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
ffd0: 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Frame);.    p->p
ffe0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  Frame = 0;.    p
fff0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->nFrame = 0;.  
10000 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
10010 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c  Frame==0 );.  cl
10020 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
10030 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  e(p);.  if( p->a
10040 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
10050 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  seMemArray(p->aM
10060 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  em, p->nMem);.  
10070 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
10080 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
10090 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
100a0 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
100b0 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
100c0 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
100d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
100e0 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
100f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
10100 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
10110 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
10120 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
10130 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20  if( p->pAuxData 
10140 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
10150 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62  eteAuxData(p->db
10160 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
10170 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
10180 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
10190 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   );.}../*.** Cle
101a0 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
101b0 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e  er a single run.
101c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
101d0 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
101e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
101f0 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
10200 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10210 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
10220 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
10230 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
10240 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
10250 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
10260 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
10270 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
10280 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
10290 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
102a0 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
102b0 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
102c0 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
102d0 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
102e0 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
102f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
10300 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
10310 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
10320 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69  lags==MEM_Undefi
10330 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ned );.  }.#endi
10340 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
10350 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
10360 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
10370 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
10380 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
10390 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
103a0 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
103b0 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
103c0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
103d0 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
103e0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
103f0 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
10400 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
10410 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
10420 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
10430 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
10440 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
10450 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
10460 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
10470 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
10480 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
10490 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
104a0 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
104b0 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
104c0 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69  nResColumn){.  i
104d0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
104e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
104f0 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  if( p->nResColum
10500 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  n ){.    release
10510 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
10520 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
10530 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
10540 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10550 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
10560 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52  e);.  }.  n = nR
10570 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
10580 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
10590 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
105a0 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
105b0 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
105c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
105d0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  N(db, sizeof(Mem
105e0 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
105f0 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
10600 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41  turn;.  initMemA
10610 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
10620 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  , n, db, MEM_Nul
10630 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  l);.}../*.** Set
10640 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10650 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
10660 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
10670 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
10680 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
10690 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
106a0 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
106b0 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
106c0 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
106d0 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
106e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
106f0 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
10700 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
10710 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
10720 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
10730 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
10740 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
10750 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
10760 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
10770 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
10780 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
10790 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
107a0 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
107b0 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
107c0 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
107d0 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
107e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
107f0 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10800 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
10830 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
10840 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10870 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
10880 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
10890 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
108b0 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
108c0 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
108d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
108e0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
108f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10900 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
10910 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
10920 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
10930 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
10940 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
10950 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
10960 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
10970 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
10980 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
10990 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
109a0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
109b0 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
109c0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
109d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
109e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
109f0 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
10a00 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
10a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10a20 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
10a30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
10a40 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
10a50 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
10a60 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
10a70 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
10a80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10a90 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
10aa0 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
10ab0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
10ac0 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
10ad0 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
10ae0 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
10af0 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
10b00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
10b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
10b20 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
10b30 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
10b40 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
10b50 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
10b60 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
10b70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10b80 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
10b90 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
10ba0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10bb0 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
10bc0 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
10bd0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
10be0 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
10bf0 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
10c00 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
10c10 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
10c20 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
10c30 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
10c40 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
10c50 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
10c60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
10c70 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
10c80 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
10c90 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  saction.        
10ca0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
10cb0 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  at are candidate
10cc0 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73  s for a two-phas
10cd0 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61  e commit using a
10ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10cf0 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
10d00 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72  urnal */.  int r
10d10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10d20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
10d30 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
10d40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10d50 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
10d60 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
10d70 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
10d80 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
10d90 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
10da0 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
10db0 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
10dc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10dd0 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
10de0 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
10df0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
10e00 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
10e10 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
10e20 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
10e30 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
10e40 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
10e50 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
10e60 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
10e70 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
10e80 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
10e90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10ea0 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
10eb0 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
10ec0 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
10ed0 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
10ee0 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
10ef0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
10f00 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
10f10 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
10f20 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
10f30 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
10f40 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
10f50 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
10f60 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
10f70 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
10f80 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
10f90 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
10fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
10fb0 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
10fc0 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
10fd0 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
10fe0 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
10ff0 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
11000 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
11010 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
11020 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
11030 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
11040 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
11050 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
11060 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
11070 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
11080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11090 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
110a0 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
110b0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
110c0 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
110d0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
110e0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
110f0 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
11100 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69  ot a database mi
11110 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65  ght need a maste
11120 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64  r journal depend
11130 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  s upon.      ** 
11140 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  its journal mode
11150 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68   (among other th
11160 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74  ings).  This mat
11170 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77  rix determines w
11180 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  hich.      ** jo
11190 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20  urnal modes use 
111a0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
111b0 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f   and which do no
111c0 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  t */.      stati
111d0 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65  c const u8 aMJNe
111e0 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eded[] = {.     
111f0 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a     /* DELETE   *
11200 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  /  1,.        /*
11210 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c   PERSIST   */ 1,
11220 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20  .        /* OFF 
11230 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
11240 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20      /* TRUNCATE 
11250 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
11260 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30  * MEMORY    */ 0
11270 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ,.        /* WAL
11280 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20         */ 0.    
11290 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72    };.      Pager
112a0 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50   *pPager;   /* P
112b0 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
112c0 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20  with pBt */.    
112d0 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
112e0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
112f0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
11300 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
11310 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
11320 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  r(pBt);.      if
11330 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66  ( db->aDb[i].saf
11340 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52  ety_level!=PAGER
11350 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
11360 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65  .       && aMJNe
11370 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65  eded[sqlite3Page
11380 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
11390 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29  pPager)].      )
113a0 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  { .        asser
113b0 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20  t( i!=1 );.     
113c0 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20     nTrans++;.   
113d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
113e0 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
113f0 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
11400 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11410 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
11420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11440 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
11460 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
11470 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
11480 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
11490 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
114a0 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
114b0 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
114c0 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
114d0 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
114e0 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
114f0 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
11500 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
11510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
11520 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
11530 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
11540 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
11550 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
11560 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
11570 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
11580 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
11590 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
115a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
115b0 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
115c0 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
115d0 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
115e0 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
115f0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
11600 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
11610 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
11620 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
11630 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
11640 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
11650 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
11660 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
11670 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
11680 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
11690 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
116a0 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
116b0 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
116c0 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
116d0 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
116e0 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
116f0 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
11700 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
11710 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
11720 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
11730 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
11740 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
11750 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
11760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11770 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11780 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11790 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
117a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
117b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
117c0 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
117d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
117e0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
117f0 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
11800 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
11810 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
11820 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
11830 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
11840 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11850 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
11860 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
11870 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
11880 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
11890 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
118a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
118b0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
118c0 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
118d0 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
118e0 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
118f0 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
11900 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
11910 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
11920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11930 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
11940 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
11950 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11960 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11970 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
11980 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11990 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
119a0 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
119b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
119c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
119d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
119e0 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
119f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
11a00 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
11a10 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
11a20 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
11a30 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
11a40 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
11a50 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
11a60 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
11a70 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
11a80 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
11a90 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
11aa0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
11ab0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
11ac0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
11ad0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
11ae0 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68  db->pVfs;.    ch
11af0 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
11b00 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
11b10 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
11b20 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
11b30 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
11b40 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
11b50 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
11b60 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
11b70 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
11b80 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
11b90 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
11ba0 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
11bb0 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
11bc0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
11bd0 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
11be0 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
11bf0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
11c00 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
11c10 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
11c20 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
11c30 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
11c40 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11c50 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
11c60 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
11c70 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
11c80 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
11c90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11ca0 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
11cb0 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
11cc0 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
11cd0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
11ce0 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
11cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11d00 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
11d10 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
11d20 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
11d30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11d40 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
11d50 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
11d60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11d70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11d80 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
11d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11da0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
11db0 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
11dc0 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
11dd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11de0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
11df0 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
11e00 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
11e10 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
11e20 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
11e30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11e40 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
11e50 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
11e60 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
11e90 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
11ea0 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
11eb0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
11ec0 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
11ed0 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
11ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
11ef0 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
11f00 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
11f10 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
11f20 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
11f30 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
11f40 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
11f50 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
11f60 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
11f70 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
11f80 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
11f90 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
11fa0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
11fb0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
11fc0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
11fd0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
11fe0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
11ff0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
12000 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
12010 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12030 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
12040 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
12050 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12060 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
12070 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
12080 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
12090 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
120a0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
120b0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
120c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
120d0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
120e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
120f0 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
12100 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
12110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12130 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12140 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
12150 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
12160 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
12170 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
12180 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
12190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
121a0 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
121b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
121c0 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
121d0 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
121e0 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
121f0 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
12200 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12210 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
12220 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12230 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
12240 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
12250 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
12260 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
12270 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
12280 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
12290 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
122a0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
122c0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
122d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
122e0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
122f0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12300 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
12310 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
12320 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
12330 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
12340 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
12350 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
12360 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
12370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12380 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
12390 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
123a0 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
123b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
123c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
123d0 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
123e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
123f0 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
12400 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
12410 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
12420 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
12430 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
12440 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12450 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
12460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12480 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
12490 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
124a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
124b0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
124c0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
124d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
124e0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
124f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12500 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
12510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12520 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
12530 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12540 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
12550 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
12560 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
12570 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
12580 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
12590 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71  /.    if( 0==(sq
125a0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
125b0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
125c0 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
125d0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
125e0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
125f0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
12600 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
12610 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
12620 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
12630 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
12640 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
12650 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
12660 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
12670 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
12680 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12690 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
126a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
126b0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
126c0 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
126d0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
126e0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
126f0 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
12700 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
12710 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
12720 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
12730 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
12740 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
12750 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
12760 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
12770 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12780 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
12790 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
127a0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
127b0 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
127c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
127d0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
127e0 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
127f0 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
12800 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
12810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
12820 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
12830 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
12840 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
12850 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
12860 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
12870 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
12880 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
12890 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
128a0 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
128b0 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
128c0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
128d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
128e0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
128f0 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
12900 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12910 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12920 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12930 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12940 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
12950 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
12960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
12970 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
12980 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
12990 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
129a0 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
129b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
129c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
129d0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
129e0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
129f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
12a00 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
12a10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12a20 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
12a30 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
12a40 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
12a50 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
12a60 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
12a70 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
12a80 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
12a90 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
12aa0 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
12ab0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
12ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
12ad0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12ae0 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
12af0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
12b00 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
12b10 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
12b20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
12b30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
12b40 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
12b50 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
12b60 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
12b70 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
12b80 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
12b90 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
12ba0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12bb0 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
12bc0 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
12bd0 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
12be0 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
12bf0 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
12c00 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
12c10 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
12c20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
12c30 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
12c40 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
12c50 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
12c60 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12c70 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
12c80 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
12c90 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
12ca0 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
12cb0 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
12cc0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
12cd0 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
12ce0 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
12cf0 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
12d00 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12d10 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
12d20 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
12d30 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
12d40 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12d50 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
12d60 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12d70 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12d80 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12d90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12da0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
12db0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
12dc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12dd0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
12de0 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
12df0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12e00 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
12e10 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
12e20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
12e30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
12e40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12e50 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
12e60 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
12e70 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
12e80 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
12e90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
12ea0 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
12eb0 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
12ec0 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
12ed0 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
12ee0 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
12ef0 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
12f00 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
12f10 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
12f20 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
12f30 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
12f40 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
12f50 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
12f60 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
12f70 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
12f80 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
12f90 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
12fa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
12fb0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
12fc0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12fd0 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
12fe0 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
12ff0 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
13000 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
13010 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
13020 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
13030 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
13040 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
13050 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
13060 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
13070 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
13080 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
13090 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
130a0 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
130b0 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
130c0 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
130d0 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
130e0 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
130f0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
13100 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
13110 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
13120 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
13130 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
13140 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13150 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
13160 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
13170 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
13180 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
13190 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
131a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
131b0 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
131c0 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
131d0 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
131e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
131f0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
13200 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
13210 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
13220 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
13230 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
13240 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
13250 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
13260 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
13270 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
13280 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
13290 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
132a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
132b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
132c0 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
132d0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
132e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
132f0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
13300 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
13310 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
13320 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61  int vdbeCloseSta
13330 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
13340 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
13350 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
13360 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
13370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13380 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  nt i;.  const in
13390 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
133a0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
133b0 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
133c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
133d0 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
133e0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
133f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
13400 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
13410 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
13420 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
13430 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
13440 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28  oint) );..  for(
13450 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
13460 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72  i++){ .    int r
13470 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
13480 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
13490 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
134a0 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
134b0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
134c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
134d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32  K ){.        rc2
134e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
134f0 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
13500 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13510 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
13520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13530 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
13540 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
13550 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
13560 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
13570 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
13580 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
13590 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
135a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
135b0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
135c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
135d0 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d   }.  db->nStatem
135e0 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61  ent--;.  p->iSta
135f0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69  tement = 0;..  i
13600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13610 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   ){.    if( eOp=
13620 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
13630 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
13640 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
13650 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
13660 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
13670 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
13680 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
136a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
136b0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
136c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
136d0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
136e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
136f0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
13700 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
13710 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
13720 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
13730 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
13740 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
13750 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
13760 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
13770 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
13780 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
13790 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
137a0 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
137b0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
137c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
137d0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
137e0 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
137f0 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d  DefCons;.    db-
13800 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
13810 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
13820 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65  mmCons;.  }.  re
13830 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
13840 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
13850 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
13860 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66  , int eOp){.  if
13870 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d  ( p->db->nStatem
13880 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
13890 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75  ment ){.    retu
138a0 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  rn vdbeCloseStat
138b0 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20  ement(p, eOp);. 
138c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
138d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
138e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
138f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
13900 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
13910 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
13920 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
13930 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13940 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
13950 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
13960 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
13970 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
13980 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
13990 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
139a0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
139b0 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
139c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
139d0 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
139e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
139f0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
13a00 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
13a10 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
13a20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
13a30 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
13a40 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
13a50 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
13a60 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13a70 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
13a80 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
13a90 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
13aa0 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
13ab0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
13ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13ad0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
13ae0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
13af0 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
13b00 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
13b10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13b20 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
13b30 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
13b40 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
13b50 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
13b60 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
13b70 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
13b80 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
13b90 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
13ba0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13bb0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
13bc0 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
13bd0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
13be0 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
13bf0 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
13c00 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
13c10 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
13c20 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13c40 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
13c50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13c60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
13c70 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
13c80 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
13c90 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
13ca0 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
13cb0 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
13cc0 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
13cd0 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
13ce0 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
13cf0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
13d00 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
13d10 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
13d20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
13d30 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
13d40 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
13d50 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
13d60 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
13d70 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
13d80 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
13d90 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
13da0 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
13db0 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
13dc0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
13dd0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
13de0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
13df0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
13e00 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
13e10 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
13e20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
13e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13e40 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
13e50 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
13e60 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
13e70 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
13e80 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
13e90 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
13ea0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13eb0 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
13ec0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
13ef0 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
13f00 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
13f10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13f20 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
13f30 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
13f40 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
13f50 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
13f60 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
13f70 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13f80 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
13f90 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
13fa0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13fb0 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
13fc0 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
13fd0 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
13fe0 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
13ff0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
14000 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
14010 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
14020 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
14030 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
14040 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
14050 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
14060 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
14070 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
14080 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
14090 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
140a0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
140b0 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
140c0 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
140d0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
140e0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
140f0 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
14100 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
14110 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
14120 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
14130 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
14140 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
14150 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
14160 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
14170 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14180 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
14190 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
141a0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
141b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
141c0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  BKPT;.  }.  clos
141d0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
141e0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
141f0 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
14200 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
14210 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
14220 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
14230 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
14240 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
14250 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
14260 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
14270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14280 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
14290 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
142a0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
142b0 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
142c0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
142d0 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
142e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
142f0 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
14300 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
14310 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
14320 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
14330 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
14340 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
14350 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
14360 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
14370 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
14380 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
14390 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
143a0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
143b0 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
143c0 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
143d0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
143e0 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
143f0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
14400 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
14420 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
14430 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
14440 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
14450 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
14460 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
14470 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
14480 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
14490 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
144a0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
144b0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
144c0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
144d0 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
144e0 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
144f0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
14500 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
14510 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
14520 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
14530 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
14540 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
14550 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
14560 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
14570 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
14580 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
14590 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
145a0 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
145b0 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
145c0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
145d0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
145e0 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
145f0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
14600 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
14610 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
14620 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
14630 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
14640 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
14650 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
14660 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
14670 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
14680 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
14690 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
146a0 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
146b0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
146c0 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
146d0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
146e0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
146f0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
14700 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
14710 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
14720 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
14730 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
14740 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
14750 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
14760 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
14770 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
14780 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
14790 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
147a0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
147b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
147c0 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
147d0 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
147e0 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
147f0 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
14800 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
14810 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
14820 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
14830 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
14840 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
14850 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
14860 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14870 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14880 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14890 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
148a0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
148b0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
148c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
148d0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
148e0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
148f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
14900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
14910 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
14920 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
14930 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
14940 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
14950 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14970 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
14980 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
14990 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
149a0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
149b0 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
149c0 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
149d0 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
149e0 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
149f0 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
14a00 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
14a10 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
14a20 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
14a30 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
14a40 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
14a50 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
14a60 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
14a70 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
14a80 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
14a90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
14aa0 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
14ab0 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
14ac0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
14ad0 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
14ae0 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
14af0 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
14b00 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
14b10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
14b20 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
14b30 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
14b40 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
14b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b60 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
14b70 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
14b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14b90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
14ba0 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
14bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14bc0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
14bd0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
14be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14bf0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
14c00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
14c10 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
14c20 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
14c30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
14c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14c50 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
14c60 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
14c70 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
14c80 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
14c90 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
14ca0 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
14cb0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
14cc0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
14cd0 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
14ce0 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
14cf0 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
14d00 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
14d10 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
14d20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
14d30 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
14d40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
14d50 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
14d60 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
14d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14d80 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
14d90 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
14da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14db0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14dc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14dd0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
14de0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
14df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14e00 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
14e10 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
14e20 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14e30 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
14e40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
14e50 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14e60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e70 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
14e80 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
14e90 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
14ea0 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
14eb0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
14ec0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
14ed0 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
14ee0 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
14ef0 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
14f00 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
14f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14f20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14f30 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14f40 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
14f50 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
14f70 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
14f80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
14f90 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
14fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
14fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14fc0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
14fd0 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
14fe0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
14ff0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
15000 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
15010 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
15020 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
15030 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
15040 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
15050 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
15060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15070 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
15080 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
15090 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
150a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
150b0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
150c0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
150d0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
150e0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
150f0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
15100 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
15110 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
15120 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
15130 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
15140 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
15150 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
15160 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
15170 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
15180 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
15190 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
151a0 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
151b0 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
151c0 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
151d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
151e0 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
151f0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
15200 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
15210 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
15220 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
15230 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
15240 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
15250 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15260 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
15270 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15280 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
15290 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
152a0 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
152b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
152c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
152d0 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
152e0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
152f0 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
15300 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
15310 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15320 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
15330 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
15340 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15350 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
15360 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
15370 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
15380 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
15390 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
153a0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
153b0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
153c0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
153d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
153e0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
153f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
15400 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
15410 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
15420 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
15430 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
15440 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
15450 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
15460 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
15470 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
15480 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
15490 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
154a0 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
154b0 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
154c0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
154d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
154e0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
154f0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
15500 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
15510 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
15520 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15530 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
15540 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
15550 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
15560 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
15570 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
15580 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
15590 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
155a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
155b0 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
155c0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
155d0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
155e0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
155f0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
15600 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
15610 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
15620 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
15630 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
15640 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
15650 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
15660 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
15670 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
15680 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
15690 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
156a0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
156b0 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
156c0 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
156d0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
156e0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
156f0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
15700 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
15710 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
15720 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
15730 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
15740 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15750 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
15760 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
15770 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
15780 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
15790 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
157a0 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
157b0 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
157c0 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
157d0 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
157e0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
157f0 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
15800 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
15810 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
15820 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
15830 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
15840 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
15850 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
15860 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
15870 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
15880 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
15890 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
158a0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
158b0 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
158c0 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
158d0 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
158e0 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
158f0 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
15900 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
15910 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
15920 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
15930 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
15940 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
15950 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
15960 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
15970 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
15980 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
15990 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
159a0 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
159b0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
159c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
159d0 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
159e0 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
159f0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
15a00 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
15a10 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
15a20 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
15a30 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15a40 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
15a50 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
15a60 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
15a70 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
15a80 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
15a90 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
15aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
15ab0 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
15ac0 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
15ad0 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
15ae0 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
15af0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15b00 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
15b10 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15b20 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
15b30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
15b40 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
15b50 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
15b60 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
15b70 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61     db->bBenignMa
15b80 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  lloc++;.    sqli
15b90 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
15ba0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
15bb0 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
15bc0 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
15bd0 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
15be0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
15bf0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
15c00 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
15c10 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
15c20 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
15c30 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
15c40 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15c50 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
15c60 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  oc--;.  }else if
15c70 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20  ( db->pErr ){.  
15c80 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
15c90 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b  tNull(db->pErr);
15ca0 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f  .  }.  db->errCo
15cb0 64 65 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  de = rc;.  retur
15cc0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
15cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
15ce0 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
15cf0 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
15d00 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
15d10 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
15d20 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
15d30 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
15d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15d50 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
15d60 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
15d70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15d80 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
15d90 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
15da0 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
15db0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
15dc0 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
15dd0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
15de0 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
15df0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
15e00 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
15e10 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
15e20 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
15e30 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15e40 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
15e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
15e60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
15e70 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
15e80 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
15e90 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
15ea0 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
15eb0 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
15ec0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
15ed0 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
15ee0 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
15ef0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
15f00 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
15f10 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
15f20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
15f30 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
15f40 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
15f50 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
15f60 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
15f70 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
15f80 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
15f90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
15fa0 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
15fb0 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
15fc0 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
15fd0 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
15fe0 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
15ff0 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
16000 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
16010 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
16020 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
16030 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
16040 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
16050 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
16060 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
16070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16080 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
16090 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
160a0 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
160b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
160c0 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
160d0 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
160e0 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
160f0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
16100 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
16110 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
16120 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
16130 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
16140 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16150 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
16160 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
16170 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
16180 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
16190 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
161a0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
161b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
161c0 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
161d0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
161e0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
161f0 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
16200 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
16210 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
16220 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
16230 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
16240 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
16250 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
16260 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
16270 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
16280 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
16290 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
162a0 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
162b0 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
162c0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
162d0 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
162e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
162f0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
16300 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
16310 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
16320 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
16330 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
16340 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
16350 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
16360 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
16370 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
16380 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
16390 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
163a0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
163b0 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
163c0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
163d0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
163e0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
163f0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
16400 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
16410 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
16420 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
16430 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
16440 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
16450 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
16460 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
16470 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16480 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
16490 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
164a0 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
164b0 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
164c0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
164d0 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
164e0 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
164f0 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
16500 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
16510 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
16520 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
16530 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
16540 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
16550 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
16560 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
16570 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
16580 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
16590 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
165a0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
165b0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
165c0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
165d0 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
165e0 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
165f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16600 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
16610 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
16620 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
16630 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
16640 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
16650 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
16660 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
16670 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
16680 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
16690 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
166a0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
166b0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
166c0 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
166d0 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
166e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
166f0 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
16700 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
16710 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
16720 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16730 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
16740 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
16750 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
16760 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
16770 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
16780 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
16790 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
167a0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
167b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
167c0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
167d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
167e0 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
167f0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
16800 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
16810 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
16820 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
16830 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
16840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
16850 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
16860 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
16870 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
16880 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
16890 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
168a0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
168b0 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20  RESET;.  return 
168c0 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
168d0 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
168e0 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
168f0 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
16900 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
16910 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
16920 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
16930 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
16940 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
16950 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
16960 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
16970 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
16980 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
16990 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
169a0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
169b0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
169c0 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
169d0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
169e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
169f0 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
16a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
16a10 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
16a20 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
16a30 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16a40 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
16a60 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
16a70 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
16a80 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
16a90 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
16aa0 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
16ab0 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
16ac0 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
16ad0 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
16ae0 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
16af0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
16b00 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
16b10 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
16b20 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
16b30 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
16b40 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
16b50 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
16b60 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
16b70 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
16b80 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
16b90 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
16ba0 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
16bb0 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
16bc0 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
16bd0 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
16be0 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
16bf0 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
16c00 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
16c10 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
16c20 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
16c30 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
16c40 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
16c50 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
16c60 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
16c70 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
16c80 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
16c90 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
16ca0 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
16cb0 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
16cc0 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
16cd0 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
16ce0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16cf0 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73  eDeleteAuxData(s
16d00 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44  qlite3 *db, AuxD
16d10 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f  ata **pp, int iO
16d20 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
16d30 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
16d40 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
16d50 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
16d60 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
16d70 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f  pAux->iAuxOp==iO
16d80 70 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  p.          && p
16d90 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a  Aux->iAuxArg>=0.
16da0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 41            && (pA
16db0 75 78 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c  ux->iAuxArg>31 |
16dc0 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
16dd0 49 54 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41  IT32(pAux->iAuxA
16de0 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
16df0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
16e00 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20  ux->iAuxArg==31 
16e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  );.      if( pAu
16e20 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b  x->xDeleteAux ){
16e30 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
16e40 44 65 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e  DeleteAux(pAux->
16e50 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
16e60 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
16e70 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20  >pNextAux;.     
16e80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16e90 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65  b, pAux);.    }e
16ea0 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26  lse{.      pp= &
16eb0 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a  pAux->pNextAux;.
16ec0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
16ed0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
16ee0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
16ef0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
16f00 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
16f10 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
16f20 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
16f30 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
16f40 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
16f50 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
16f60 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
16f70 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
16f80 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
16f90 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
16fa0 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
16fb0 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
16fc0 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
16fd0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
16fe0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
16ff0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
17000 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
17010 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
17020 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
17030 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
17040 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
17050 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
17060 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  ub, *pNext;.  as
17070 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
17080 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
17090 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
170a0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
170b0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
170c0 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
170d0 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
170e0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
170f0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
17100 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
17110 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
17120 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
17130 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
17140 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17150 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66   pSub);.  }.  if
17160 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
17170 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
17180 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
17190 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
171a0 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Var);.    sqlite
171b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
171c0 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  VList);.    sqli
171d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
171e0 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76  >pFree);.  }.  v
171f0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
17200 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
17210 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
17220 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
17230 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
17240 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
17250 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
17260 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
17270 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20  ANSTATUS.  {.   
17280 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
17290 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b  i=0; i<p->nScan;
172a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
172b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
172c0 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65  ->aScan[i].zName
172d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
172e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
172f0 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65  ->aScan);.  }.#e
17300 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
17310 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
17320 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
17330 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
17340 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
17350 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
17360 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
17370 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
17380 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
17390 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
173a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
173b0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
173c0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
173d0 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
173e0 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
173f0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
17400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
17410 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
17420 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
17430 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
17440 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
17450 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
17460 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
17470 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
17480 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
17490 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
174a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
174b0 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
174c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
174d0 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
174e0 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
174f0 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
17500 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
17510 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
17520 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
17530 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17540 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
17550 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
17560 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
17570 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
17580 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
17590 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
175a0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
175b0 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
175c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
175d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
175e0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
175f0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
17600 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
17610 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
17620 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
17630 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
17640 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
17650 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20  BTREE );.  rc = 
17660 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
17670 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63  toUnpacked(p->uc
17680 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  .pCursor, 0, p->
17690 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
176a0 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
176b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
176c0 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
176d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
176e0 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
176f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
17700 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
17710 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
17720 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
17730 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
17740 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
17750 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
17760 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17770 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
17780 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
17790 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
177a0 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
177b0 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
177c0 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
177d0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
177e0 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
177f0 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
17800 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
17810 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
17820 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
17830 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
17840 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
17850 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
17860 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
17870 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
17880 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
17890 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
178a0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
178b0 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
178c0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
178d0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
178e0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
178f0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
17900 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
17910 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
17920 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
17930 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
17940 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e    assert( p->uc.
17950 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
17960 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17970 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
17980 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
17990 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
179a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
179b0 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72  store(p->uc.pCur
179c0 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
179d0 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
179e0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
179f0 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
17a00 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
17a10 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
17a20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17a30 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
17a40 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
17a50 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
17a60 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
17a70 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
17a80 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
17a90 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
17aa0 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
17ab0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
17ac0 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
17ad0 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
17ae0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
17af0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
17b00 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28  E_BTREE );.  if(
17b10 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
17b20 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
17b30 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
17b40 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
17b50 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
17b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17b70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17b80 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
17b90 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
17ba0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
17bb0 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
17bc0 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
17bd0 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
17be0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
17bf0 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
17c00 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
17c10 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
17c20 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
17c30 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
17c40 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
17c50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
17c60 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
17c70 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
17c80 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
17c90 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
17ca0 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
17cb0 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
17cc0 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
17cd0 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
17ce0 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
17cf0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
17d00 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
17d10 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
17d20 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
17d30 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
17d40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
17d50 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
17d60 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
17d70 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
17d80 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
17d90 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
17da0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
17db0 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
17dc0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17de0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
17df0 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c  VdbeCursor **pp,
17e00 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20   int *piCol){.  
17e10 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20  VdbeCursor *p = 
17e20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *pp;.  assert( p
17e30 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
17e40 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e  YPE_BTREE || p->
17e50 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
17e60 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66  E_PSEUDO );.  if
17e70 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
17e80 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eto ){.    int i
17e90 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  Map;.    if( p->
17ea0 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70  aAltMap && (iMap
17eb0 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b   = p->aAltMap[1+
17ec0 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20  *piCol])>0 ){.  
17ed0 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c      *pp = p->pAl
17ee0 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a  tCursor;.      *
17ef0 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31  piCol = iMap - 1
17f00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
17f10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
17f20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
17f30 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17f40 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  p);.  }.  if( sq
17f50 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17f60 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
17f70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
17f80 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
17f90 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
17fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17fb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
17fc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
17fd0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
17fe0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17ff0 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
18000 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18010 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
18020 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
18030 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18040 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
18050 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
18060 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
18070 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
18080 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
18090 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
180a0 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
180b0 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
180c0 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
180d0 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
180e0 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
180f0 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
18100 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
18110 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
18120 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
18130 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
18140 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
18150 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
18160 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
18170 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
18180 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
18190 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
181a0 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
181b0 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
181c0 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
181d0 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
181e0 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
181f0 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
18200 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
18210 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
18220 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
18230 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
18240 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
18250 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
18260 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
18270 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
18280 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
18290 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
182a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
182b0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
182c0 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
182d0 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
182e0 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
182f0 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
18300 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
18310 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
18320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
18330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
18340 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18350 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18370 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
18380 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183a0 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
183b0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
183c0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
183d0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
183e0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
183f0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
18420 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
18430 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
18450 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
18460 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
18470 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
18480 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
18490 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
184a0 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184c0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
184d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
184e0 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
184f0 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
18500 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
18510 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
18540 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
18550 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18570 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
18580 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
18590 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
185c0 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
185d0 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
185e0 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
185f0 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
18600 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
18610 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
18620 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
18630 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
18640 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
18650 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
18660 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
18670 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
18680 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
18690 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
186a0 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
186b0 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
186c0 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
186d0 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
186e0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
186f0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
18700 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
18710 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
18720 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a  le_format, u32 *
18730 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pLen){.  int fla
18740 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
18750 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73  ;.  u32 n;..  as
18760 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b  sert( pLen!=0 );
18770 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
18780 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Null ){.    *pL
18790 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  en = 0;.    retu
187a0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
187b0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
187c0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
187d0 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
187e0 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
187f0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
18800 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
18810 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
18820 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
18830 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
18840 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
18850 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
18860 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20      u = ~i;.    
18870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
18880 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
18890 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
188a0 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26    if( (i&1)==i &
188b0 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
188c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65   ){.        *pLe
188d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  n = 0;.        r
188e0 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a  eturn 8+(u32)u;.
188f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18900 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a       *pLen = 1;.
18910 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
18920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18930 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
18940 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72   ){ *pLen = 2; r
18950 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69  eturn 2; }.    i
18960 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b  f( u<=8388607 ){
18970 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75   *pLen = 3; retu
18980 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 3; }.    if( 
18990 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  u<=2147483647 ){
189a0 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75   *pLen = 4; retu
189b0 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 4; }.    if( 
189c0 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20  u<=MAX_6BYTE ){ 
189d0 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72  *pLen = 6; retur
189e0 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e  n 5; }.    *pLen
189f0 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
18a00 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
18a10 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
18a20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
18a30 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
18a40 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
18a50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
18a60 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
18a70 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
18a80 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
18a90 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28  >n>=0 );.  n = (
18aa0 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  u32)pMem->n;.  i
18ab0 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
18ac0 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
18ad0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
18ae0 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a   }.  *pLen = n;.
18af0 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
18b00 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
18b10 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
18b20 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73  ./*.** The sizes
18b30 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65   for serial type
18b40 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a  s less than 128.
18b50 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
18b60 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  u8 sqlite3SmallT
18b70 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20  ypeSizes[] = {. 
18b80 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31         /*  0   1
18b90 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35     2   3   4   5
18ba0 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39     6   7   8   9
18bb0 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f   */   ./*   0 */
18bc0 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33     0,  1,  2,  3
18bd0 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38  ,  4,  6,  8,  8
18be0 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30  ,  0,  0,./*  10
18bf0 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
18c00 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c    0,  1,  1,  2,
18c10 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20    2,  3,  3,./* 
18c20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20   20 */   4,  4, 
18c30 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20   5,  5,  6,  6, 
18c40 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a   7,  7,  8,  8,.
18c50 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20  /*  30 */   9,  
18c60 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31  9, 10, 10, 11, 1
18c70 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31  1, 12, 12, 13, 1
18c80 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34  3,./*  40 */  14
18c90 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36  , 14, 15, 15, 16
18ca0 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38  , 16, 17, 17, 18
18cb0 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20  , 18,./*  50 */ 
18cc0 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c   19, 19, 20, 20,
18cd0 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c   21, 21, 22, 22,
18ce0 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20   23, 23,./*  60 
18cf0 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20  */  24, 24, 25, 
18d00 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20  25, 26, 26, 27, 
18d10 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20  27, 28, 28,./*  
18d20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33  70 */  29, 29, 3
18d30 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33  0, 30, 31, 31, 3
18d40 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f  2, 32, 33, 33,./
18d50 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34  *  80 */  34, 34
18d60 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36  , 35, 35, 36, 36
18d70 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38  , 37, 37, 38, 38
18d80 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c  ,./*  90 */  39,
18d90 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c   39, 40, 40, 41,
18da0 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c   41, 42, 42, 43,
18db0 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20   43,./* 100 */  
18dc0 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20  44, 44, 45, 45, 
18dd0 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20  46, 46, 47, 47, 
18de0 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a  48, 48,./* 110 *
18df0 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35  /  49, 49, 50, 5
18e00 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35  0, 51, 51, 52, 5
18e10 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32  2, 53, 53,./* 12
18e20 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35  0 */  54, 54, 55
18e30 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37  , 55, 56, 56, 57
18e40 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  , 57.};../*.** R
18e50 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
18e60 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
18e70 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
18e80 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
18e90 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
18ea0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18eb0 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
18ec0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
18ed0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38  serial_type>=128
18ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
18ef0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
18f00 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
18f10 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18f20 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20  ype<12 .        
18f30 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d      || sqlite3Sm
18f40 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18f50 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69  ial_type]==(seri
18f60 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20  al_type - 12)/2 
18f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
18f80 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18f90 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
18fa0 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74  ;.  }.}.u8 sqlit
18fb0 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72  e3VdbeOneByteSer
18fc0 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65  ialTypeLen(u8 se
18fd0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73  rial_type){.  as
18fe0 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
18ff0 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72  e<128 );.  retur
19000 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
19010 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
19020 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ype];  .}../*.**
19030 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
19040 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
19050 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
19060 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
19070 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
19080 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
19090 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
190a0 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
190b0 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
190c0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
190d0 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
190e0 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
190f0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
19100 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
19110 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
19120 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
19130 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
19140 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
19150 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
19160 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
19170 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
19180 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
19190 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
191a0 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
191b0 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
191c0 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
191d0 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
191e0 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
191f0 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
19200 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
19210 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
19220 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
19230 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
19240 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
19250 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
19260 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
19270 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
19280 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
19290 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
192a0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
192b0 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
192c0 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
192d0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
192e0 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
192f0 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
19300 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
19310 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
19320 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
19330 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
19340 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
19350 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
19360 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
19370 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
19380 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
19390 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
193a0 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
193b0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
193c0 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
193d0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
193e0 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
193f0 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
19400 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
19410 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
19420 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
19430 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
19440 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
19450 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
19460 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
19470 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
19480 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
19490 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
194a0 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
194b0 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
194c0 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
194d0 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
194e0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
194f0 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
19500 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
19510 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
19520 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
19530 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
19540 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
19550 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
19560 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
19570 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
19580 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
19590 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
195a0 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
195b0 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
195c0 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
195d0 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
195e0 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
195f0 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
19600 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
19610 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
19620 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
19630 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
19640 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
19650 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
19660 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
19670 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
19680 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
19690 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
196a0 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
196b0 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
196c0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
196d0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
196e0 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
196f0 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
19700 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
19710 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
19720 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
19730 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
19740 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
19750 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
19760 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
19770 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
19780 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
19790 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
197a0 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
197b0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
197c0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
197d0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
197e0 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
197f0 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
19800 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
19810 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
19820 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
19830 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
19840 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
19850 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
19860 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
19870 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19880 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
19890 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
198a0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
198b0 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
198c0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
198d0 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
198e0 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
198f0 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
19900 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
19910 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
19920 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
19930 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
19940 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
19950 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
19960 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19970 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19980 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
19990 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
199a0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
199b0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
199c0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
199d0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
199e0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
199f0 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
19a00 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
19a10 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
19a20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19a30 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
19a40 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
19a50 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
19a60 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
19a70 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
19a80 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
19a90 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
19aa0 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
19ab0 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
19ac0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
19ad0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
19ae0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
19af0 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
19b00 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
19b10 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
19b20 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
19b30 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
19b40 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
19b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b60 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
19b70 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
19b80 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
19b90 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
19ba0 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72  type];.    asser
19bb0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f  t( i>0 );.    do
19bc0 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d  {.      buf[--i]
19bd0 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
19be0 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
19bf0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b      }while( i );
19c00 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
19c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
19c20 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
19c30 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
19c40 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
19c50 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
19c60 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
19c70 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
19c80 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
19c90 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
19ca0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
19cb0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
19cc0 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
19cd0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20  Mem->n;.    if( 
19ce0 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62  len>0 ) memcpy(b
19cf0 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
19d00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
19d10 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
19d20 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
19d30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
19d40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74  n 0;.}../* Input
19d50 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e   "x" is a sequen
19d60 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63  ce of unsigned c
19d70 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72  haracters that r
19d80 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69  epresent a.** bi
19d90 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19da0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71  .  Return the eq
19db0 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20  uivalent native 
19dc0 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69  integer.*/.#defi
19dd0 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  ne ONE_BYTE_INT(
19de0 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30  x)    ((i8)(x)[0
19df0 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42  ]).#define TWO_B
19e00 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32  YTE_INT(x)    (2
19e10 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  56*(i8)((x)[0])|
19e20 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[1]).#define 
19e30 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78  THREE_BYTE_INT(x
19e40 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28  )  (65536*(i8)((
19e50 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
19e60 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69  8)|(x)[2]).#defi
19e70 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  ne FOUR_BYTE_UIN
19e80 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29  T(x)  (((u32)(x)
19e90 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d  [0]<<24)|((x)[1]
19ea0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
19eb0 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e  )|(x)[3]).#defin
19ec0 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  e FOUR_BYTE_INT(
19ed0 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38  x) (16777216*(i8
19ee0 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
19ef0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
19f00 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
19f10 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
19f20 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
19f30 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
19f40 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
19f50 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
19f60 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19f70 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
19f80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19f90 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  bytes read..**.*
19fa0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19fb0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
19fc0 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72  s two separate r
19fd0 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66  outines for perf
19fe0 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
19ff0 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72  few cases that r
1a000 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72  equire local var
1a010 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65  iables are broke
1a020 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70  n out into a sep
1a030 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65  arate.** routine
1a040 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74   so that in most
1a050 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68   cases the overh
1a060 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68  ead of moving th
1a070 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a  e stack pointer.
1a080 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a  ** is avoided..*
1a090 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51  / .static u32 SQ
1a0a0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65  LITE_NOINLINE se
1a0b0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
1a0c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a0d0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
1a0e0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
1a0f0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1a100 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1a110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1a120 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1a130 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1a140 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1a150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1a160 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1a170 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1a180 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f  .){.  u64 x = FO
1a190 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1a1a0 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55  );.  u32 y = FOU
1a1b0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
1a1c0 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32  4);.  x = (x<<32
1a1d0 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72  ) + y;.  if( ser
1a1e0 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
1a1f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a200 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32  F: R-29851-52272
1a210 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a220 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20  endian 64-bit.  
1a230 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1a240 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1a250 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
1a260 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
1a270 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a280 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
1a290 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a2a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a2b0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a2c0 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56   R-57343-49114 V
1a2d0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1a2e0 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30  dian IEEE 754-20
1a2f0 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  08 64-bit.    **
1a300 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1a310 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21  number. */.#if !
1a320 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
1a330 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1a340 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1a350 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56  _POINT).    /* V
1a360 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
1a370 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
1a380 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
1a390 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
1a3a0 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
1a3b0 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
1a3c0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1a3d0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
1a3e0 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
1a3f0 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
1a400 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
1a410 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
1a420 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
1a430 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
1a440 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
1a450 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
1a460 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69  )<<32;.    stati
1a470 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
1a480 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34  1 = 1.0;.    u64
1a490 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77   t2 = t1;.    sw
1a4a0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1a4b0 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65  at(t2);.    asse
1a4c0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
1a4d0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
1a4e0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
1a4f0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
1a500 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1a510 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
1a520 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
1a530 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  >u.r)==8 );.    
1a540 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
1a550 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d  loat(x);.    mem
1a560 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  cpy(&pMem->u.r, 
1a570 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
1a580 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a590 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
1a5a0 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f  Mem->u.r) ? MEM_
1a5b0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
1a5c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
1a5d0 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
1a5e0 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
1a5f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a600 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
1a610 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
1a620 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
1a630 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a650 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
1a660 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
1a670 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a690 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
1a6a0 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
1a6b0 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
1a6c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1a6d0 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
1a6e0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1a6f0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1a700 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
1a710 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
1a720 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
1a730 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c  ase 0: {  /* Nul
1a740 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  l */.      /* EV
1a750 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
1a760 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69  78-09375 Value i
1a770 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20  s a NULL. */.   
1a780 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a790 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
1a7a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a7b0 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
1a7c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a7d0 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20  : R-44885-25196 
1a7e0 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69  Value is an 8-bi
1a7f0 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
1a800 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  t.      ** integ
1a810 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a820 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
1a830 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a840 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a850 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a860 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a870 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a880 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a890 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
1a8a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a8b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a8c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a8d0 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75  49794-35026 Valu
1a8e0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a8f0 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 16-bit.      *
1a900 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a910 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a920 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a930 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
1a940 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1a950 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a970 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1a980 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
1a990 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
1a9a0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
1a9b0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a9c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a9d0 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33  -OF: R-37839-543
1a9e0 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  01 Value is a bi
1a9f0 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a  g-endian 24-bit.
1aa00 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1aa10 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1aa20 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1aa30 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
1aa40 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1aa50 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1aa60 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1aa70 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1aa80 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1aa90 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
1aaa0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1aab0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1aac0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1aad0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1aae0 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75  01849-26079 Valu
1aaf0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1ab00 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 32-bit.      *
1ab10 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1ab20 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1ab30 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1ab40 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
1ab50 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f  f);.#ifdef __HP_
1ab60 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72  cc .      /* Wor
1ab70 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d  k around a sign-
1ab80 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e  extension bug in
1ab90 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72   the HP compiler
1aba0 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20   for HP/UX */.  
1abb0 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30      if( buf[0]&0
1abc0 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20  x80 ) pMem->u.i 
1abd0 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30  |= 0xffffffff800
1abe0 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a  00000LL;.#endif.
1abf0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1ac00 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1ac10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1ac20 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1ac30 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
1ac40 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1ac50 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1ac60 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1ac70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1ac80 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
1ac90 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1aca0 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
1acb0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1acc0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1acd0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1ace0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
1acf0 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
1ad00 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1ad10 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1ad20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1ad30 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1ad40 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1ad50 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1ad60 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
1ad70 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
1ad80 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1ad90 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
1ada0 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
1adb0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
1adc0 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
1add0 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
1ade0 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
1adf0 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
1ae00 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1ae10 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
1ae20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
1ae30 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
1ae40 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
1ae50 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
1ae60 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
1ae70 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
1ae80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1ae90 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
1aea0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
1aeb0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
1aec0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1aed0 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
1aee0 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
1aef0 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
1af00 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1af10 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
1af20 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
1af30 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
1af40 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1af50 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
1af60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1af70 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1af80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af90 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1afa0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
1afb0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
1afc0 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
1afd0 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
1afe0 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
1aff0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
1b000 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
1b010 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
1b020 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
1b030 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
1b040 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
1b050 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
1b060 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
1b070 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
1b080 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
1b090 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
1b0a0 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
1b0b0 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
1b0c0 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
1b0d0 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
1b0e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1b0f0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1b100 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
1b110 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
1b120 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
1b130 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
1b140 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
1b150 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
1b160 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b170 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
1b180 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
1b190 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
1b1a0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
1b1b0 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
1b1c0 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
1b1d0 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
1b1e0 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
1b1f0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
1b200 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1b210 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
1b220 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
1b230 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
1b240 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
1b250 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
1b260 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1b270 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
1b280 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
1b290 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
1b2a0 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
1b2b0 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
1b2c0 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
1b2d0 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
1b2e0 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
1b2f0 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
1b300 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
1b310 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
1b320 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
1b330 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1b340 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1b350 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
1b360 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
1b370 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
1b380 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
1b390 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
1b3a0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1b3b0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
1b3c0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1b3d0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1b3e0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1b3f0 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
1b400 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
1b410 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
1b420 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
1b430 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20   *pKeyInfo      
1b440 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
1b450 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
1b460 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e  ecord */.){.  Un
1b470 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b490 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
1b4a0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1b4b0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1b4e0 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
1b4f0 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  *p */.  nByte = 
1b500 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
1b510 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b  packedRecord)) +
1b520 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b   sizeof(Mem)*(pK
1b530 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1b540 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70  d+1);.  p = (Unp
1b550 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
1b560 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1b570 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
1b580 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20  Byte);.  if( !p 
1b590 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
1b5a0 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28  >aMem = (Mem*)&(
1b5b0 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
1b5c0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1b5d0 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
1b5e0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
1b5f0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1b600 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
1b610 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
1b620 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
1b630 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b  ->nKeyField + 1;
1b640 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1b650 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1b660 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
1b670 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
1b680 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
1b690 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
1b6a0 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
1b6b0 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
1b6c0 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
1b6d0 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
1b6e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1b6f0 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
1b700 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
1b710 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1b720 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
1b730 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
1b740 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1b750 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
1b760 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
1b770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b780 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
1b790 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
1b7a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1b7b0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
1b7c0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1b7d0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1b7e0 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
1b7f0 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
1b800 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
1b810 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
1b820 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b830 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1b840 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b850 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
1b860 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
1b890 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
1b8a0 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
1b8d0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
1b8e0 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
1b8f0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
1b900 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64  p->aMem;..  p->d
1b910 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20  efault_rc = 0;. 
1b920 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1b930 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d  YTE_ALIGNMENT(pM
1b940 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67  em) );.  idx = g
1b950 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1b960 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
1b970 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
1b980 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1b990 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a  r && d<=nKey ){.
1b9a0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1b9b0 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d  ype;..    idx +=
1b9c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1b9d0 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f  ey[idx], serial_
1b9e0 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  type);.    pMem-
1b9f0 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  >enc = pKeyInfo-
1ba00 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  >enc;.    pMem->
1ba10 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1ba20 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e  b;.    /* pMem->
1ba30 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71  flags = 0; // sq
1ba40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1ba50 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68  et() will set th
1ba60 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  is for us */.   
1ba70 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20   pMem->szMalloc 
1ba80 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  = 0;.    pMem->z
1ba90 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
1baa0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1bab0 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
1bac0 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
1bad0 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
1bae0 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e    if( (++u)>=p->
1baf0 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a  nField ) break;.
1bb00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
1bb10 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  =pKeyInfo->nKeyF
1bb20 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
1bb30 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
1bb40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1bb50 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1bb60 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1bb70 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1bb80 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1bb90 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1bba0 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1bbb0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1bbc0 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1bbd0 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1bbe0 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1bbf0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1bc00 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1bc10 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1bc20 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1bc30 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1bc40 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1bc50 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1bc60 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1bc70 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1bc80 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1bc90 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1bca0 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1bcb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1bcc0 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1bcd0 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1bce0 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1bcf0 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1bd00 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1bd10 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1bd20 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1bd30 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1bd40 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1bd50 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1bd60 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1bd70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1bd80 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1bd90 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1bda0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1bdb0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1bdc0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1bdd0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1bde0 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1bdf0 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1be00 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1be10 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1be20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1be30 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1be40 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1be50 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1be60 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1be70 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1be80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1be90 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1bea0 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1beb0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1bec0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1bed0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1bee0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1bef0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1bf00 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1bf10 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1bf20 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1bf30 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1bf40 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1bf50 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1bf60 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1bf70 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1bf80 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1bf90 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1bfa0 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1bfb0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1bfc0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1bfd0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1bfe0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1bff0 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1c000 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1c010 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c020 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1c030 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1c040 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1c050 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1c060 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1c070 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1c080 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1c090 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1c0a0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1c0b0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1c0c0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1c0d0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1c0e0 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1c0f0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1c100 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1c110 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1c120 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1c130 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1c140 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1c150 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1c160 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1c170 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1c180 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1c190 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1c1a0 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1c1b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1c1c0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1c1d0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1c1e0 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1c1f0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1c200 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1c210 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1c220 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1c230 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1c240 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1c250 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1c260 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1c270 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1c280 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1c290 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1c2a0 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1c2b0 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1c2c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c2d0 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1c2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1c2f0 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e  Info->nAllField>
1c300 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1c310 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1c320 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1c330 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1c340 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c350 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1c360 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1c370 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1c380 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1c390 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1c3a0 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
1c3b0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
1c3c0 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
1c3d0 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
1c3e0 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
1c3f0 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
1c400 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
1c410 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
1c420 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
1c430 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
1c440 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
1c450 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
1c460 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
1c470 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
1c480 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
1c490 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
1c4a0 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
1c4b0 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
1c4c0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
1c4d0 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
1c4e0 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
1c4f0 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
1c500 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
1c510 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
1c520 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
1c530 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
1c540 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c550 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
1c560 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
1c570 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
1c580 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1c590 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
1c5a0 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
1c5b0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1c5c0 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
1c5d0 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
1c5e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c5f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
1c600 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
1c610 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
1c620 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
1c630 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1c640 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1c650 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
1c660 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
1c670 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
1c680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c690 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1c6a0 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
1c6b0 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
1c6c0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
1c6d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1c6e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c6f0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1c700 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1c710 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1c720 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1c730 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1c740 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1c750 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
1c760 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
1c770 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
1c780 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
1c790 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72  goto debugCompar
1c7a0 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eEnd;.    }.    
1c7b0 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  i++;.  }while( i
1c7c0 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
1c7d0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
1c7e0 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1c7f0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1c800 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1c810 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1c820 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1c830 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1c840 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1c850 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1c860 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1c870 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1c880 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1c890 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1c8a0 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
1c8b0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1c8c0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1c8d0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1c8e0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
1c8f0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1c900 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1c910 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1c920 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1c930 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1c940 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1c950 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1c960 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50  e.  */.  rc = pP
1c970 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1c980 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45  ;..debugCompareE
1c990 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65  nd:.  if( desire
1c9a0 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63  dResult==0 && rc
1c9b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1c9c0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1c9d0 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20  ult<0 && rc<0 ) 
1c9e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1c9f0 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20  desiredResult>0 
1ca00 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e  && rc>0 ) return
1ca10 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50   1;.  if( CORRUP
1ca20 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b  T_DB ) return 1;
1ca30 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1ca40 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1ca50 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1ca60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1ca70 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1ca80 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f  E_DEBUG./*.** Co
1ca90 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
1caa0 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e  f fields (a.k.a.
1cab0 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65   columns) in the
1cac0 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79   record given by
1cad0 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20  .** pKey,nKey.  
1cae0 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74 20  The verify that 
1caf0 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65  this count is le
1cb00 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1cb10 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74   to the.** limit
1cb20 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e   given by pKeyIn
1cb30 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a  fo->nAllField..*
1cb40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e  *.** If this con
1cb50 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73  straint is not s
1cb60 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61  atisfied, it mea
1cb70 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68  ns that the high
1cb80 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65  -speed.** vdbeRe
1cb90 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1cba0 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43   and vdbeRecordC
1cbb0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72  ompareString() r
1cbc0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20  outines will.** 
1cbd0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1cbe0 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73  ly.  If this ass
1cbf0 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73  ert() ever fires
1cc00 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65  , it probably me
1cc10 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ans.** that the 
1cc20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  KeyInfo.nKeyFiel
1cc30 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c  d or KeyInfo.nAl
1cc40 6c 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  lField values we
1cc50 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1cc60 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1cc70 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1cc80 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1cc90 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1cca0 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1ccb0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1ccc0 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1ccd0 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1cce0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1ccf0 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1cd00 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1cd10 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1cd20 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1cd30 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1cd40 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1cd50 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1cd60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1cd70 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1cd80 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1cd90 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1cda0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1cdb0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1cdc0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1cdd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1cde0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1cdf0 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1ce00 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1ce10 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1ce20 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1ce30 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1ce40 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1ce50 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1ce60 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1ce70 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20  Info->nAllField 
1ce80 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1ce90 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69  ine vdbeAssertFi
1cea0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1ceb0 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64  mits(A,B,C).#end
1cec0 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
1ced0 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
1cee0 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
1cef0 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
1cf00 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
1cf10 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
1cf20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
1cf30 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
1cf40 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
1cf50 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
1cf60 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
1cf70 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
1cf80 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1cf90 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
1cfa0 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
1cfb0 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
1cfc0 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
1cfd0 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
1cfe0 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
1cff0 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
1d000 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1d010 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1d020 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
1d030 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
1d040 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20  ollSeq *pColl,. 
1d050 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20   u8 *prcErr     
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d070 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63   /* If an OOM oc
1d080 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c  curs, set to SQL
1d090 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a  ITE_NOMEM */.){.
1d0a0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63    if( pMem1->enc
1d0b0 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
1d0c0 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
1d0d0 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  gs are already i
1d0e0 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e  n the correct en
1d0f0 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68  coding.  Call th
1d100 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e.     ** compar
1d110 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69  ison function di
1d120 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65  rectly */.    re
1d130 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  turn pColl->xCmp
1d140 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d  (pColl->pUser,pM
1d150 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c  em1->n,pMem1->z,
1d160 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e  pMem2->n,pMem2->
1d170 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1d180 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e   int rc;.    con
1d190 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32  st void *v1, *v2
1d1a0 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20  ;.    Mem c1;.  
1d1b0 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71    Mem c2;.    sq
1d1c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1d1d0 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c1, pMem1->db,
1d1e0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1d1f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1d200 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c2, pMem1->d
1d210 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1d220 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1d230 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c  ShallowCopy(&c1,
1d240 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65   pMem1, MEM_Ephe
1d250 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1d260 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1d270 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45  y(&c2, pMem2, ME
1d280 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31  M_Ephem);.    v1
1d290 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1d2a0 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1d2b0 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c1, pColl->
1d2c0 65 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d 20 73  enc);.    v2 = s
1d2d0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1d2e0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1d2f0 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c2, pColl->enc)
1d300 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30  ;.    if( (v1==0
1d310 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20   || v2==0) ){.  
1d320 20 20 20 20 69 66 28 20 70 72 63 45 72 72 20 29      if( prcErr )
1d330 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54   *prcErr = SQLIT
1d340 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1d350 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
1d360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1d370 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
1d380 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e  oll->pUser, c1.n
1d390 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b  , v1, c2.n, v2);
1d3a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d3b0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1d3c0 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&c1);.    sqlit
1d3d0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1d3e0 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72  (&c2);.    retur
1d3f0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
1d400 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c  ** The input pBl
1d410 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ob is guaranteed
1d420 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68   to be a Blob th
1d430 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64  at is not marked
1d440 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72  .** with MEM_Zer
1d450 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  o.  Return true 
1d460 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61  if it could be a
1d470 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73   zero-blob..*/.s
1d480 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a  tatic int isAllZ
1d490 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ero(const char *
1d4a0 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
1d4b0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1d4c0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
1d4d0 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( z[i] ) return 
1d4e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1d4f0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
1d500 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20  are two blobs.  
1d510 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1d520 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1d530 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  ve if the first.
1d540 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ** is less than,
1d550 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1d560 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
1d570 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76  econd, respectiv
1d580 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62  ely..** If one b
1d590 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20  lob is a prefix 
1d5a0 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68  of the other, th
1d5b0 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69  en the shorter i
1d5c0 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f  s the lessor..*/
1d5d0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
1d5e0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
1d5f0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
1d600 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
1d610 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
1d620 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
1d630 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e  1 = pB1->n;.  in
1d640 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a  t n2 = pB2->n;..
1d650 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
1d660 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c  ble to have a Bl
1d670 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  ob value that ha
1d680 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20  s some non-zero 
1d690 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c  content.  ** fol
1d6a0 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f  lowed by zero co
1d6b0 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74  ntent.  But that
1d6c0 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66   only comes up f
1d6d0 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a  or Blobs formed.
1d6e0 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d    ** by the OP_M
1d6f0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1d700 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73  , and such Blobs
1d710 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65   never get passe
1d720 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
1d730 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e  te3MemCompare().
1d740 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1d750 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1d760 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d  Zero)==0 || n1==
1d770 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1d780 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1d790 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d  _Zero)==0 || n2=
1d7a0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42  =0 );..  if( (pB
1d7b0 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c  1->flags|pB2->fl
1d7c0 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  ags) & MEM_Zero 
1d7d0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e  ){.    if( pB1->
1d7e0 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61  flags & pB2->fla
1d7f0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1d800 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1d810 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32  1->u.nZero - pB2
1d820 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1d830 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c  else if( pB1->fl
1d840 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1d850 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1d860 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70  llZero(pB2->z, p
1d870 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B2->n) ) return 
1d880 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d890 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1d8a0 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n2;.    }else{. 
1d8b0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1d8c0 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d  ero(pB1->z, pB1-
1d8d0 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  >n) ) return +1;
1d8e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31  .      return n1
1d8f0 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1d900 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d  .    }.  }.  c =
1d910 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1d920 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20  pB2->z, n1>n2 ? 
1d930 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20  n2 : n1);.  if( 
1d940 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1d950 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a  return n1 - n2;.
1d960 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1d970 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1d980 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1d990 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1d9a0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
1d9b0 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
1d9c0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1d9d0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1d9e0 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1d9f0 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
1da00 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
1da10 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1da20 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
1da30 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
1da40 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
1da50 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
1da60 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
1da70 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
1da80 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
1da90 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
1daa0 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
1dab0 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
1dac0 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
1dad0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
1dae0 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1daf0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1db00 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
1db10 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
1db20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
1db30 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1db40 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1db50 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33   if( r>922337203
1db60 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72  6854775807.0 ) r
1db70 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1db80 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1db90 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1dba0 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1dbb0 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53  {.      if( y==S
1dbc0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1dbd0 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20   r>0.0 ) return 
1dbe0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1dbf0 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   +1;.    }.    s
1dc00 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
1dc10 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75    if( s<r ) retu
1dc20 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73  rn -1;.    if( s
1dc30 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1dc40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1dc50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1dc60 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
1dc70 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
1dc80 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
1dc90 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
1dca0 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
1dcb0 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
1dcc0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1dcd0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1dce0 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
1dcf0 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
1dd00 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
1dd10 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
1dd20 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
1dd30 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
1dd40 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
1dd50 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
1dd60 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
1dd70 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
1dd80 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
1dd90 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
1dda0 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
1ddb0 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
1ddc0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1ddd0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
1dde0 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
1ddf0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1de00 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
1de10 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
1de20 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1de30 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1de40 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
1de50 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
1de60 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
1de70 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
1de80 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
1de90 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
1dea0 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
1deb0 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
1dec0 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
1ded0 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
1dee0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1def0 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
1df00 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
1df10 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
1df20 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
1df30 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
1df40 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1df50 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
1df60 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
1df70 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
1df80 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
1df90 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73   }..  /* At leas
1dfa0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  t one of the two
1dfb0 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d   values is a num
1dfc0 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ber.  */.  if( c
1dfd0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1dfe0 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1dff0 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1e000 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
1e010 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1e020 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
1e030 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1e040 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1e050 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
1e060 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1e070 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1e080 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1e090 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1e0a0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1e0b0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1e0c0 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r < pMem2->u.r )
1e0d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1e0e0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1e0f0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   > pMem2->u.r ) 
1e100 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1e110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1e120 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1e130 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1e140 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1e150 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1e160 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e170 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1e180 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem1->u.i, pMem
1e190 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  2->u.r);.      }
1e1a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1e1b0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1e1c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1e1d0 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1e1e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1e1f0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1e200 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1e210 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1e220 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e  ompare(pMem2->u.
1e230 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a  i, pMem1->u.r);.
1e240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e250 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1e260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e270 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d    return +1;.  }
1e280 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1e290 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1e2a0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1e2b0 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
1e2c0 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
1e2d0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
1e2e0 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
1e2f0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1e300 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1e310 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1e320 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1e330 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1e340 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1e350 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1e360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1e370 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1e380 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e390 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1e3a0 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1e3b0 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c  c==pMem2->enc ||
1e3c0 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c   pMem1->db->mall
1e3d0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1e3e0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1e3f0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1e400 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1e410 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1e420 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1e430 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1e440 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1e450 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1e460 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1e470 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1e480 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1e490 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1e4a0 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1e4b0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1e4c0 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1e4d0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1e4e0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1e4f0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1e500 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1e510 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1e520 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1e530 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1e540 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1e550 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1e560 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1e570 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1e580 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1e590 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1e5a0 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1e5b0 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1e5c0 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1e5d0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1e5e0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1e5f0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1e600 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1e610 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1e620 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1e630 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1e640 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1e650 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1e660 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1e670 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1e680 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1e690 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1e6a0 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1e6b0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1e6c0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1e6d0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1e6e0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1e6f0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1e700 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1e710 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1e720 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1e730 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1e740 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1e750 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1e760 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1e770 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1e780 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1e790 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1e7a0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1e7b0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1e7c0 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1e7d0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1e7e0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1e7f0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1e800 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1e810 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1e820 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1e830 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1e840 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1e850 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1e860 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1e870 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e880 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e890 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1e8a0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1e8b0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1e8c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e8d0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e8e0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1e8f0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e900 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1e910 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e920 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e930 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1e940 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e950 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1e960 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e970 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e980 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1e990 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1e9a0 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1e9b0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1e9c0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1e9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e9e0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e9f0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1ea00 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1ea10 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1ea20 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1ea30 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1ea40 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1ea50 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1ea60 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1ea70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1ea80 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1ea90 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1eaa0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1eab0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1eac0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1ead0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1eae0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1eaf0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1eb00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1eb10 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1eb20 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1eb30 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1eb40 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1eb50 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1eb60 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1eb70 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1eb80 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1eb90 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1eba0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1ebb0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1ebc0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1ebd0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1ebe0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1ebf0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1ec00 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1ec10 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1ec20 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1ec30 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1ec40 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1ec50 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1ec60 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1ec70 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1ec80 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1ec90 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1eca0 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1ecb0 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1ecc0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1ecd0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1ece0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1ecf0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1ed00 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1ed10 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1ed20 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1ed30 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1ed40 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1ed50 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1ed60 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1ed70 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1ed80 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1ed90 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1eda0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1edb0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1edc0 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1edd0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1ede0 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1edf0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1ee00 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1ee10 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1ee20 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1ee30 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1ee40 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1ee50 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1ee60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1ee70 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1ee80 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1ee90 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1eea0 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1eeb0 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1eec0 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1eed0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1eee0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1eef0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1ef00 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1ef10 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1ef20 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1ef30 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1ef40 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1ef50 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1ef60 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ef80 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1ef90 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1efa0 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1efd0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1efe0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1eff0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f020 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1f030 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1f040 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1f050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f060 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1f070 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1f080 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1f0b0 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1f0c0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1f0d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f0f0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1f100 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1f110 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1f120 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1f130 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1f140 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1f150 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1f160 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1f170 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1f180 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1f190 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1f1a0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1f1b0 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1f1c0 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1f1d0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1f1e0 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1f1f0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1f200 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1f210 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1f220 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1f230 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1f240 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1f250 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1f260 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1f270 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1f280 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1f290 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1f2a0 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1f2b0 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1f2c0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1f2d0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1f2e0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1f2f0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1f300 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f310 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1f320 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1f330 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1f340 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1f350 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1f360 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1f370 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1f380 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1f390 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1f3a0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1f3b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f3c0 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1f3d0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1f3e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1f3f0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1f400 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1f410 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1f420 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1f430 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1f440 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1f450 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1f460 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
1f470 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20  Key2->nField .  
1f480 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
1f490 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1f4a0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1f4b0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1f4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1f4d0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1f4e0 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
1f4f0 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1f500 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1f510 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1f520 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
1f530 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1f540 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1f550 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
1f560 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
1f570 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1f580 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1f590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f5a0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f5b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f5c0 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
1f5d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f5e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f5f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1f600 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f610 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1f620 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f630 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
1f640 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1f650 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1f660 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1f670 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
1f680 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1f690 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
1f6a0 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
1f6b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f6c0 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
1f6d0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1f6e0 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
1f6f0 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
1f700 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
1f710 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1f720 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1f730 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1f740 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1f750 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1f760 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1f770 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1f780 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f790 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
1f7a0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1f7b0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1f7c0 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
1f7d0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1f7e0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1f7f0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1f800 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
1f810 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
1f820 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
1f830 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
1f840 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
1f850 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1f860 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
1f870 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
1f880 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
1f890 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
1f8a0 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
1f8b0 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
1f8c0 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
1f8d0 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
1f8e0 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
1f8f0 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
1f900 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
1f910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1f920 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f930 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1f940 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f950 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1f960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f970 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1f980 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1f990 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1f9a0 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
1f9b0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1f9c0 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1f9d0 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
1f9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f9f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
1fa00 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
1fa10 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
1fa20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fa30 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
1fa40 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1fa50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fa60 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1fa70 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
1fa80 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
1fa90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1faa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1fab0 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
1fac0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1fad0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
1fae0 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
1faf0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1fb00 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1fb10 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1fb20 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1fb30 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1fb40 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1fb50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1fb60 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1fb70 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
1fb80 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1fb90 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1fba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fbb0 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
1fbc0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1fbd0 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1fbe0 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1fbf0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1fc00 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1fc10 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1fc20 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
1fc30 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1fc40 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
1fc50 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1fc60 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1fc70 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1fc80 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1fc90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fca0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fcc0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1fcd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1fce0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
1fcf0 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
1fd00 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1fd10 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1fd20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
1fd30 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1fd40 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
1fd50 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
1fd60 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
1fd70 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
1fd80 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
1fd90 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
1fda0 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
1fdb0 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
1fdc0 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
1fdd0 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
1fde0 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
1fdf0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
1fe00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1fe10 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1fe20 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1fe30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1fe40 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1fe50 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1fe60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fe70 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1fe80 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1fe90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fea0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1feb0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1fec0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1fed0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1fee0 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73  Blob ){.      as
1fef0 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61  sert( (pRhs->fla
1ff00 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
1ff10 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20  0 || pRhs->n==0 
1ff20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  );.      getVari
1ff30 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1ff40 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1ff50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ff60 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1ff70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1ff80 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
1ff90 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1ffa0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
1ffb0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1ffc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1ffd0 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
1ffe0 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1fff0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20000 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
20010 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
20020 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20030 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
20040 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
20050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
20060 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
20070 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
20080 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
20090 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
200a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
200b0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
200c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
200d0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
200e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
200f0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
20100 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
20110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
20120 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e   !isAllZero((con
20130 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  st char*)&aKey1[
20140 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20  d1],nStr) ){.   
20150 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
20160 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
20170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
20180 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
20190 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
201a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
201b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
201c0 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
201d0 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
201e0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
201f0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
20200 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
20210 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
20220 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
20230 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
20240 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20250 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
20260 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
20270 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
20280 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
20290 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
202a0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
202b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
202c0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
202d0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
202e0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
202f0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
20300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20310 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
20320 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
20330 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20340 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
20350 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
20360 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
20370 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
20380 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
20390 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
203a0 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b   i++;.    pRhs++
203b0 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
203c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
203d0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
203e0 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
203f0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
20400 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
20410 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
20420 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
20430 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
20440 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  d && d1<=(unsign
20450 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
20460 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
20470 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
20480 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
20490 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
204a0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
204b0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
204c0 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
204d0 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
204e0 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
204f0 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
20500 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
20510 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
20520 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
20530 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
20540 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
20550 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
20560 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
20570 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
20580 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
20590 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
205a0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
205b0 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
205c0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
205d0 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
205e0 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
205f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
20600 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
20610 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20620 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20630 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
20640 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
20650 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62   || pKeyInfo->db
20660 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
20670 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71   );.  pPKey2->eq
20680 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75  Seen = 1;.  retu
20690 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
206a0 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
206b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
206c0 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
206d0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
206e0 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
206f0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
20700 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
20710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
20720 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
20730 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20740 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
20750 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
20760 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
20770 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
20780 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
20790 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
207a0 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
207b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
207c0 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
207d0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
207e0 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
207f0 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
20800 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
20810 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
20820 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
20830 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
20840 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
20850 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
20860 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
20870 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
20880 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
20890 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
208a0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
208b0 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
208c0 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
208d0 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
208e0 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
208f0 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
20900 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
20910 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
20920 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
20930 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
20940 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
20950 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
20960 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
20970 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
20980 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
20990 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
209a0 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
209b0 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
209c0 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
209d0 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
209e0 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
209f0 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
20a00 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
20a10 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  4 v;.  i64 lhs;.
20a20 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
20a30 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
20a40 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
20a50 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
20a60 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
20a70 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
20a80 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
20a90 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
20aa0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
20ab0 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
20ac0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20ad0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20ae0 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
20af0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20b00 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20b20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
20b30 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
20b40 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20b50 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
20b60 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
20b70 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20b80 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20b90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20ba0 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
20bb0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
20bc0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
20bd0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
20be0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
20bf0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
20c00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20c10 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
20c20 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
20c30 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
20c40 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
20c50 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
20c60 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
20c70 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
20c80 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20ca0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
20cb0 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
20cc0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20cd0 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
20ce0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
20cf0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
20d00 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
20d10 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
20d20 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
20d30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20d40 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
20d50 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
20d60 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
20d70 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
20d80 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
20d90 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
20da0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20db0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
20dc0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
20dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20de0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20df0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20e00 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
20e10 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
20e20 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
20e30 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
20e40 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
20e50 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
20e60 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
20e70 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
20e80 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
20e90 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
20ea0 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
20eb0 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
20ec0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
20ed0 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
20ee0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
20ef0 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
20f00 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
20f10 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
20f20 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
20f30 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
20f40 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
20f50 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
20f60 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
20f70 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
20f80 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
20f90 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
20fa0 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
20fb0 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
20fc0 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
20fd0 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
20fe0 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
20ff0 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
21000 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
21010 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
21020 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21030 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
21040 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
21050 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21060 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
21070 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
21080 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32   }..  v = pPKey2
21090 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
210a0 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
210b0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
210c0 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
210d0 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
210e0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
210f0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
21100 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
21110 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
21120 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
21130 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
21140 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
21150 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
21160 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
21170 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
21180 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
21190 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
211a0 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
211b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
211c0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
211d0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
211e0 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
211f0 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
21200 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
21210 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
21220 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
21230 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
21240 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21250 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
21260 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
21270 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 1;.  }..  asse
21280 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
21290 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
212a0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
212b0 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
212c0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
212d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
212e0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
212f0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
21300 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21310 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
21320 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
21330 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
21340 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
21350 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
21360 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
21370 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
21380 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
21390 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
213a0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
213b0 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
213c0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
213d0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
213e0 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
213f0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
21400 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
21410 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
21420 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
21430 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
21440 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
21450 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
21460 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
21470 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
21480 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
21490 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
214a0 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
214b0 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
214c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  PKey2->aMem[0].f
214d0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
214e0 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ;.  vdbeAssertFi
214f0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
21500 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
21510 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
21520 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
21530 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
21540 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
21550 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
21560 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
21570 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
21580 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
21590 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
215a0 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
215b0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
215c0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
215d0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
215e0 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
215f0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
21600 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
21610 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
21620 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
21630 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
21640 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
21650 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
21660 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
21670 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
21680 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
21690 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
216a0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
216b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
216c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
216d0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
216e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
216f0 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
21700 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
21710 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
21720 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
21730 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
21740 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
21750 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
21760 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
21770 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
21780 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
21790 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
217a0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
217b0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
217c0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
217d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
217e0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
217f0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
21800 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
21810 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
21820 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
21830 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20  lt_rc;.         
21840 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
21850 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
21860 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
21870 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
21880 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
21890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
218a0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
218b0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d  ey2->r1;.      }
218c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
218d0 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65  es>0 ){.      re
218e0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
218f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21900 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21910 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
21920 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
21930 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
21940 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21950 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
21960 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
21970 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
21980 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
21990 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
219a0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
219b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
219c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
219d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
219e0 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
219f0 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
21a00 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
21a10 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
21a20 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
21a30 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
21a40 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
21a50 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
21a60 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
21a70 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
21a80 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
21a90 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
21aa0 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
21ab0 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
21ac0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
21ad0 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
21ae0 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
21af0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
21b00 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
21b10 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
21b20 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
21b30 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
21b40 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
21b50 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
21b60 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
21b70 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
21b80 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
21b90 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
21ba0 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
21bb0 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
21bc0 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
21bd0 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
21be0 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
21bf0 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
21c00 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
21c10 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
21c20 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
21c30 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
21c40 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
21c50 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
21c60 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
21c70 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
21c80 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
21c90 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
21ca0 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
21cb0 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
21cc0 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
21cd0 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
21ce0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
21cf0 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
21d00 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
21d10 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
21d20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
21d30 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
21d40 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
21d50 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
21d60 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
21d70 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
21d80 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
21d90 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
21da0 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
21db0 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
21dc0 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
21dd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b    */.  if( p->pK
21de0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
21df0 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  d<=13 ){.    int
21e00 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
21e10 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
21e20 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
21e30 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
21e40 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
21e50 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
21e60 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
21e70 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
21e80 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
21e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21ea0 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
21eb0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
21ec0 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
21ed0 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
21ee0 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21ef0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
21f00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21f10 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
21f20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21f30 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21f40 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
21f50 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
21f60 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
21f70 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
21f80 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
21f90 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
21fa0 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
21fb0 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
21fc0 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
21fd0 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
21fe0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21ff0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22000 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
22010 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
22020 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
22030 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
22040 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
22050 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
22060 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
22070 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
22080 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
22090 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
220a0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
220b0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
220c0 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
220d0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
220e0 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
220f0 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
22100 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
22110 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
22120 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
22130 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
22140 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
22150 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
22160 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
22170 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
22180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
22190 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
221a0 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
221b0 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
221c0 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
221d0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
221e0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
221f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22200 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
22210 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
22220 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
22230 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
22240 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
22250 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
22260 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
22270 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
22280 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
22290 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
222a0 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
222b0 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
222c0 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
222d0 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
222e0 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
222f0 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
22300 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
22310 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
22320 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
22330 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
22340 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
22350 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
22360 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
22370 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
22380 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
22390 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
223a0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
223b0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
223c0 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    nCellKey = sql
223d0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
223e0 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73  Size(pCur);.  as
223f0 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
22400 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
22410 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
22420 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
22430 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
22440 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
22450 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
22460 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
22470 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
22480 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
22490 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
224a0 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
224b0 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  Key, &m);.  if( 
224c0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
224d0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
224e0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
224f0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
22500 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
22510 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
22520 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
22530 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
22540 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
22550 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
22560 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
22570 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
22580 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
22590 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
225a0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
225b0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
225c0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
225d0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
225e0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
225f0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
22600 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
22610 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
22620 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
22630 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
22640 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
22650 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
22660 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
22670 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22680 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
22690 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
226a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
226b0 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
226c0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
226d0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
226e0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
226f0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
22700 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
22710 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22720 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
22730 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22740 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
22750 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
22760 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
22770 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
22780 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
22790 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
227a0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
227b0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
227c0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
227d0 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
227e0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
227f0 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
22800 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
22810 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
22820 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
22830 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
22840 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
22850 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
22860 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
22870 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
22880 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
22890 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
228a0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
228b0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
228c0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
228d0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
228e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
228f0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
22900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
22910 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
22920 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
22930 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
22940 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
22950 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
22960 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
22970 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
22980 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
22990 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
229a0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
229b0 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
229c0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
229d0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
229e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
229f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22a00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
22a10 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
22a20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
22a30 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
22a40 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
22a50 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
22a60 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
22a70 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
22a80 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
22a90 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
22aa0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
22ab0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
22ac0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
22ad0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
22ae0 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
22af0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22b00 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
22b10 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
22b20 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
22b30 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
22b40 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
22b50 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
22b60 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
22b70 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
22b80 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
22b90 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
22ba0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
22bb0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
22bc0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
22bd0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
22be0 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
22bf0 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
22c00 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
22c10 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
22c20 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
22c30 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
22c40 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
22c50 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
22c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22c70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22c80 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
22c90 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
22ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22cb0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
22cc0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
22cd0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22ce0 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
22cf0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
22d00 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
22d10 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
22d40 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
22d50 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
22d60 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
22d70 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
22d80 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
22d90 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
22da0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
22db0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
22dc0 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
22dd0 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
22de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22df0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
22e00 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
22e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
22e20 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
22e30 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
22e40 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
22e50 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
22e60 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
22e70 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
22e80 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
22e90 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
22ea0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
22eb0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
22ec0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
22ed0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
22ee0 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
22ef0 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
22f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22f10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22f20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22f30 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
22f40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22f50 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
22f60 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
22f70 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
22f80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
22f90 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
22fa0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
22fb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
22fc0 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
22fd0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
22fe0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22ff0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23000 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
23010 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
23020 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
23030 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
23040 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
23050 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
23060 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
23070 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
23080 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
23090 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
230a0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
230b0 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
230c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
230d0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
230e0 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
230f0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
23100 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
23110 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
23120 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
23130 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
23140 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
23150 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
23160 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
23170 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
23180 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
23190 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
231a0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
231b0 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
231c0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
231d0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
231e0 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
231f0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
23200 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
23210 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
23220 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
23230 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
23240 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
23250 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
23260 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
23270 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
23280 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
23290 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
232a0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
232b0 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
232c0 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
232d0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
232e0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
232f0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
23300 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
23310 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
23320 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
23330 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
23340 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
23350 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
23360 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23370 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
23380 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
23390 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
233a0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
233b0 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
233c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
233d0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
233e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
233f0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
23400 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
23410 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
23420 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
23430 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
23440 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
23450 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
23460 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c  QLITE_PREPARE fl
23470 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a  ags for a Vdbe..
23480 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  */.u8 sqlite3Vdb
23490 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64  ePrepareFlags(Vd
234a0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
234b0 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d   v->prepFlags;.}
234c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
234d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
234e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
234f0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
23500 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
23510 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
23520 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
23530 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
23540 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
23550 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
23560 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
23570 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
23580 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
23590 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
235a0 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
235b0 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
235c0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
235d0 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
235e0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
235f0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
23600 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
23610 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
23620 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
23630 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
23640 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
23650 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
23660 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
23670 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
23680 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
23690 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
236a0 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
236b0 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
236c0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
236d0 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
236e0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
236f0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
23700 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
23710 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
23720 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
23730 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
23740 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
23750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23760 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
23770 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
23780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
23790 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
237a0 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
237b0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
237c0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
237d0 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
237e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
237f0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
23800 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
23810 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
23820 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
23830 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
23840 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
23850 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
23860 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
23870 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
23880 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
23890 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
238a0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
238b0 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
238c0 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
238d0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
238e0 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64  .  assert( (v->d
238f0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
23900 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
23910 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d   );.  if( iVar>=
23920 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
23930 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30  mask |= 0x800000
23940 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
23950 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
23960 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
23970 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  1));.  }.}../*.*
23980 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69  * Cause a functi
23990 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65  on to throw an e
239a0 72 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63  rror if it was c
239b0 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65  all from OP_Pure
239c0 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74  Func.** rather t
239d0 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e  han OP_Function.
239e0 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75  .**.** OP_PureFu
239f0 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  nc means that th
23a00 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  e function must 
23a10 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  be deterministic
23a20 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  , and should.** 
23a30 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  throw an error i
23a40 66 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e  f it is given in
23a50 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20  puts that would 
23a60 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65  make it non-dete
23a70 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68  rministic..** Th
23a80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
23a90 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69  voked by date/ti
23aa0 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  me functions tha
23ab0 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  t use non-determ
23ac0 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75  inistic.** featu
23ad0 72 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77  res such as 'now
23ae0 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  '..*/.int sqlite
23af0 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c  3NotPureFunc(sql
23b00 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
23b10 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  tx){.#ifdef SQLI
23b20 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
23b30 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
23b40 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20  Ctx->pVdbe==0 ) 
23b50 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
23b60 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64  .  if( pCtx->pVd
23b70 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f  be->aOp[pCtx->iO
23b80 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75  p].opcode==OP_Pu
23b90 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  reFunc ){.    sq
23ba0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
23bb0 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
23bc0 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73   "non-determinis
23bd0 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  tic function in 
23be0 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
23bf0 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   or CHECK constr
23c00 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31  aint",.       -1
23c10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
23c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
23c30 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
23c40 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
23c50 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ABLE./*.** Trans
23c60 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fer error messag
23c70 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73  e text from an s
23c80 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72  qlite3_vtab.zErr
23c90 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
23ca0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
23cb0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
23cc0 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f  te3_malloc) into
23cd0 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20   a Vdbe.zErrMsg 
23ce0 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
23cf0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
23d00 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
23d10 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69  bMalloc)..*/.voi
23d20 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70  d sqlite3VtabImp
23d30 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a  ortErrmsg(Vdbe *
23d40 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  p, sqlite3_vtab 
23d50 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70  *pVtab){.  if( p
23d60 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
23d70 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
23d80 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71   = p->db;.    sq
23d90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23da0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
23db0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
23dc0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
23dd0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
23de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23df0 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
23e00 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e  sg);.    pVtab->
23e10 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
23e20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
23e30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
23e40 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
23e50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
23e60 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f  REUPDATE_HOOK../
23e70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
23e80 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
23e90 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65  ot NULL, release
23ea0 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   any allocations
23eb0 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
23ec0 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20  with the memory 
23ed0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e  cells in the p->
23ee0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c  aMem[] array. Al
23ef0 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61  so free the Unpa
23f00 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
23f10 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20  ructure itself, 
23f20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
23f30 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
23f40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
23f50 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63  ed to free Unpac
23f60 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
23f70 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ures allocated b
23f80 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70  y.** the vdbeUnp
23f90 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
23fa0 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64  tion found in vd
23fb0 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74  beapi.c..*/.stat
23fc0 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
23fd0 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33  Unpacked(sqlite3
23fe0 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64   *db, int nField
23ff0 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  , UnpackedRecord
24000 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
24010 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24020 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
24030 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d  d; i++){.      M
24040 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
24050 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Mem[i];.      if
24060 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  ( pMem->zMalloc 
24070 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
24080 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
24090 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
240a0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
240b0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
240c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
240d0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
240e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
240f0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
24100 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  _HOOK./*.** Invo
24110 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
24120 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20  e hook. If this 
24130 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
24140 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74  DELETE pre-updat
24150 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  e call,.** then 
24160 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
24170 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
24180 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e  ment should poin
24190 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f  t to the row abo
241a0 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61  ut.** to be upda
241b0 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  te or deleted. I
241c0 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
241d0 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
241e0 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c  preupdate_old(),
241f0 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64  .** the required
24200 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
24210 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77  ead from the row
24220 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
24230 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ts to..*/.void s
24240 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64  qlite3VdbePreUpd
24250 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20  ateHook(.  Vdbe 
24260 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
24270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
24280 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  be pre-update ho
24290 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  ok is invoked by
242a0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
242b0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
242c0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
242d0 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61  to grab old.* va
242e0 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  lues from */.  i
242f0 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24310 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  * SQLITE_INSERT,
24320 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
24330 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
24340 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
24350 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
24360 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  se name */.  Tab
24370 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24390 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a  Modified table *
243a0 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20  /.  i64 iKey1,  
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243c0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b      /* Initial k
243d0 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  ey value */.  in
243e0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20  t iReg          
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24400 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65   Register for ne
24410 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  w.* record */.){
24420 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24430 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b   v->db;.  i64 iK
24440 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65  ey2;.  PreUpdate
24450 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f   preupdate;.  co
24460 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
24470 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
24480 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
24490 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20  fakeSortOrder = 
244a0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  0;..  assert( db
244b0 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20  ->pPreUpdate==0 
244c0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65  );.  memset(&pre
244d0 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f  update, 0, sizeo
244e0 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20  f(PreUpdate));. 
244f0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
24500 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b  ab)==0 ){.    iK
24510 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b  ey1 = iKey2 = 0;
24520 0a 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70  .    preupdate.p
24530 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
24540 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
24550 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24560 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
24570 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  PDATE ){.      i
24580 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69  Key2 = v->aMem[i
24590 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65  Reg].u.i;.    }e
245a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32  lse{.      iKey2
245b0 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a   = iKey1;.    }.
245c0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
245d0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
245e0 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20  b->nCol .       
245f0 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64  || (pCsr->nField
24600 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26  ==pTab->nCol+1 &
24610 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  & op==SQLITE_DEL
24620 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29  ETE && iReg==-1)
24630 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61  .  );..  preupda
24640 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75  te.v = v;.  preu
24650 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73  pdate.pCsr = pCs
24660 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f  r;.  preupdate.o
24670 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64  p = op;.  preupd
24680 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52  ate.iNewReg = iR
24690 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  eg;.  preupdate.
246a0 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b  keyinfo.db = db;
246b0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
246c0 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64  info.enc = ENC(d
246d0 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  b);.  preupdate.
246e0 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
246f0 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  d = pTab->nCol;.
24700 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
24710 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d  nfo.aSortOrder =
24720 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f   (u8*)&fakeSortO
24730 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74  rder;.  preupdat
24740 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b  e.iKey1 = iKey1;
24750 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
24760 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72  y2 = iKey2;.  pr
24770 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70  eupdate.pTab = p
24780 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Tab;..  db->pPre
24790 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
247a0 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
247b0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
247c0 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
247d0 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
247e0 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
247f0 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
24800 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
24810 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
24820 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
24830 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
24840 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
24850 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
24860 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
24870 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76  .pUnpacked);.  v
24880 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
24890 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65  db, preupdate.ke
248a0 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b  yinfo.nKeyField+
248b0 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65  1, preupdate.pNe
248c0 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66  wUnpacked);.  if
248d0 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  ( preupdate.aNew
248e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
248f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
24900 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  sr->nField; i++)
24910 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
24920 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70  dbeMemRelease(&p
24930 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d  reupdate.aNew[i]
24940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24950 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
24960 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
24970 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
24980 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
24990 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
249a0 2f 0a                                            /.