/ Hex Artifact Content
Login

Artifact 32ff5e8a7226c0bc6df0f214a5cc1a76fcc5d8863c491a800ef3d6f5236feae7:


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 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
1ba0: 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64  te3VdbeMultiLoad
1bb0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1bc0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
1bd0: 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20  *zTypes, ...){. 
1be0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
1bf0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
1c00: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1c10: 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d  Types);.  for(i=
1c20: 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69  0; (c = zTypes[i
1c30: 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
1c40: 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20   if( c=='s' ){. 
1c50: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c60: 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  *z = va_arg(ap, 
1c70: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
1c80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c90: 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20  ddOp4(p, z==0 ? 
1ca0: 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72  OP_Null : OP_Str
1cb0: 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b  ing8, 0, iDest++
1cc0: 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20  , 0, z, 0);.    
1cd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1ce0: 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20  ert( c=='i' );. 
1cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d00: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74  AddOp2(p, OP_Int
1d10: 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c  eger, va_arg(ap,
1d20: 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b   int), iDest++);
1d30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1d40: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
1d50: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1d60: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1d70: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1d80: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1da0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1dc0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1dd0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1de0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1df0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1e00: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e20: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1e30: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1e40: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1e50: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1e60: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1e70: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1e80: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1e90: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1ea0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1eb0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1ec0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1ed0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1ee0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1ef0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1f00: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1f10: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1f20: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1f30: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1f40: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1f50: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1f60: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1f70: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1f80: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1f90: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
1fa0: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
1fb0: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
1fc0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1fd0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1fe0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1ff0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
2000: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2010: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
2020: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
2030: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2040: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2050: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2060: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2070: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2080: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2090: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
20a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
20b0: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
20c0: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
20d0: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
20e0: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
20f0: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
2100: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
2110: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2120: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
2130: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
2140: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
2150: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2160: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2170: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2180: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2190: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
21a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
21b0: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f  OP_ParseSchema o
21c0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
21d0: 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f  tine is broken o
21e0: 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ut from.** sqlit
21f0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73  e3VdbeAddOp4() s
2200: 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f  ince it needs to
2210: 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d   also needs to m
2220: 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a  ark all btrees.*
2230: 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e  * as having been
2240: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
2250: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
2260: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
2270: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
2280: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
2290: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
22a0: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
22b0: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
22c0: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
22d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
22e0: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
22f0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
2300: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
2310: 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69 74    int j;.  sqlit
2320: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
2330: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
2340: 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72  iDb, 0, 0, zWher
2350: 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
2360: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
2370: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71  db->nDb; j++) sq
2380: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
2390: 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(p, j);.}../*.
23a0: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
23b0: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
23c0: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
23d0: 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e  n integer..*/.in
23e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
23f0: 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a  Op4Int(.  Vdbe *
2400: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2410: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
2420: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2430: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
2440: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
2450: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
2460: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
2470: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
2480: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
2490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24a0: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
24b0: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
24c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
24d0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
24e0: 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p4              
24f0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
2500: 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20  d as an integer 
2510: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
2520: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2530: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
2540: 70 32 2c 20 70 33 29 3b 0a 20 20 69 66 28 20 70  p2, p3);.  if( p
2550: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2560: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  ed==0 ){.    Vdb
2570: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
2580: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 70 4f  Op[addr];.    pO
2590: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
25a0: 4e 54 33 32 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  NT32;.    pOp->p
25b0: 34 2e 69 20 3d 20 70 34 3b 0a 20 20 7d 0a 20 20  4.i = p4;.  }.  
25c0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
25d0: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 65 6e  /* Insert the en
25e0: 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d of a co-routin
25f0: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
2600: 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
2610: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 72  e(Vdbe *v, int r
2620: 65 67 59 69 65 6c 64 29 7b 0a 20 20 73 71 6c 69  egYield){.  sqli
2630: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2640: 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
2650: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a 20 20  , regYield);..  
2660: 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 74 65 6d  /* Clear the tem
2670: 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
2680: 63 61 63 68 65 2c 20 74 68 65 72 65 62 79 20 65  cache, thereby e
2690: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 65 61 63  nsuring that eac
26a0: 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e  h.  ** co-routin
26b0: 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20 69 6e  e has its own in
26c0: 64 65 70 65 6e 64 65 6e 74 20 73 65 74 20 6f 66  dependent set of
26d0: 20 72 65 67 69 73 74 65 72 73 2c 20 62 65 63 61   registers, beca
26e0: 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 0a  use co-routines.
26f0: 20 20 2a 2a 20 6d 69 67 68 74 20 65 78 70 65 63    ** might expec
2700: 74 20 74 68 65 69 72 20 72 65 67 69 73 74 65 72  t their register
2710: 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
2720: 64 20 61 63 72 6f 73 73 20 61 6e 20 4f 50 5f 59  d across an OP_Y
2730: 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a 20 74  ield, and.  ** t
2740: 68 61 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20  hat could cause 
2750: 70 72 6f 62 6c 65 6d 73 20 69 66 20 74 77 6f 20  problems if two 
2760: 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75 74 69  or more co-routi
2770: 6e 65 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  nes are using th
2780: 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65 6d 70  e same.  ** temp
2790: 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 2e 0a  orary register..
27a0: 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72 73 65    */.  v->pParse
27b0: 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
27c0: 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 52 61    v->pParse->nRa
27d0: 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f  ngeReg = 0;.}../
27e0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
27f0: 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  w symbolic label
2800: 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74   for an instruct
2810: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74  ion that has yet
2820: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e   to be.** coded.
2830: 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c    The symbolic l
2840: 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a  abel is really j
2850: 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e  ust a negative n
2860: 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c  umber.  The.** l
2870: 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64  abel can be used
2880: 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65   as the P2 value
2890: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
28a0: 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a  .  Later, when.*
28b0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72  * the label is r
28c0: 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65  esolved to a spe
28d0: 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74  cific address, t
28e0: 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61  he VDBE will sca
28f0: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73  n.** through its
2900: 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20   operation list 
2910: 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76  and change all v
2920: 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63  alues of P2 whic
2930: 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c  h match.** the l
2940: 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65  abel into the re
2950: 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a  solved address..
2960: 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b  **.** The VDBE k
2970: 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76  nows that a P2 v
2980: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
2990: 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61  because labels a
29a0: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67  re.** always neg
29b0: 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c  ative and P2 val
29c0: 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20  ues are suppose 
29d0: 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  to be non-negati
29e0: 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  ve..** Hence, a 
29f0: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
2a00: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61  e is a label tha
2a10: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20  t has yet to be 
2a20: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  resolved..**.** 
2a30: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
2a40: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
2a50: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
2a60: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2a70: 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61  l(Vdbe *v){.  Pa
2a80: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
2a90: 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d  se;.  int i = p-
2aa0: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
2ab0: 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56  ert( v->magic==V
2ac0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2ad0: 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d  ;.  if( (i & (i-
2ae0: 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  1))==0 ){.    p-
2af0: 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  >aLabel = sqlite
2b00: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
2b10: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
2b20: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b             (i*2+
2b50: 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  1)*sizeof(p->aLa
2b60: 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20  bel[0]));.  }.  
2b70: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
2b80: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
2b90: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
2ba0: 74 75 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a  turn ADDR(i);.}.
2bb0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
2bc0: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
2bd0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2be0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2bf0: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
2c00: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
2c10: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
2c20: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2c30: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
2c40: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2c50: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
2c60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c70: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2c80: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29  (Vdbe *v, int x)
2c90: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
2ca0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2cb0: 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20 20 61  j = ADDR(x);.  a
2cc0: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2cd0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2cf0: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61  p->nLabel );.  a
2d00: 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20  ssert( j>=0 );. 
2d10: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2d20: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
2d30: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
2d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74  .}../*.** Mark t
2d50: 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74  he VDBE as one t
2d60: 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  hat can only be 
2d70: 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f  run one time..*/
2d80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2d90: 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62  eRunOnlyOnce(Vdb
2da0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f  e *p){.  p->runO
2db0: 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a  nlyOnce = 1;.}..
2dc0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
2dd0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
2de0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2df0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a  multiple times..
2e00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2e10: 64 62 65 52 65 75 73 61 62 6c 65 28 56 64 62 65  dbeReusable(Vdbe
2e20: 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e   *p){.  p->runOn
2e30: 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23  lyOnce = 0;.}..#
2e40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2e50: 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73  UG /* sqlite3Ass
2e60: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f  ertMayAbort() lo
2e70: 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  gic */../*.** Th
2e80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
2e90: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72   and function ar
2ea0: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
2eb0: 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  e through all op
2ec0: 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64  codes.** in a Vd
2ed0: 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  be main program 
2ee0: 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20  and each of the 
2ef0: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72  sub-programs (tr
2f00: 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a  iggers) it may .
2f10: 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74  ** invoke direct
2f20: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
2f30: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75  . It should be u
2f40: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
2f50: 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b  **.**   Op *pOp;
2f60: 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72  .**   VdbeOpIter
2f70: 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20   sIter;.**.**   
2f80: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
2f90: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
2fa0: 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d  ;.**   sIter.v =
2fb0: 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd0: 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56  / v is of type V
2fe0: 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65  dbe* .**   while
2ff0: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
3000: 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a  ext(&sIter)) ){.
3010: 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d  **     // Do som
3020: 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a  ething with pOp.
3030: 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69  **   }.**   sqli
3040: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
3050: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a   sIter.apSub);.*
3060: 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  * .*/.typedef st
3070: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
3080: 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75  VdbeOpIter;.stru
3090: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a  ct VdbeOpIter {.
30a0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c0: 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20  Vdbe to iterate 
30d0: 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f  through the opco
30e0: 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50  des of */.  SubP
30f0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20  rogram **apSub; 
3100: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
3110: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  of subprograms *
3120: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20  /.  int nSub;   
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3140: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
3150: 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a  ies in apSub */.
3160: 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20    int iAddr;    
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
3190: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72  instruction to r
31a0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
31b0: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
31c0: 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69        /* 0 = mai
31d0: 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66  n program, 1 = f
31e0: 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d  irst sub-program
31f0: 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74   etc. */.};.stat
3200: 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78  ic Op *opIterNex
3210: 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29  t(VdbeOpIter *p)
3220: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d  {.  Vdbe *v = p-
3230: 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d  >v;.  Op *pRet =
3240: 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20   0;.  Op *aOp;. 
3250: 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28   int nOp;..  if(
3260: 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75   p->iSub<=p->nSu
3270: 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d  b ){..    if( p-
3280: 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >iSub==0 ){.    
3290: 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a    aOp = v->aOp;.
32a0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e        nOp = v->n
32b0: 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Op;.    }else{. 
32c0: 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70       aOp = p->ap
32d0: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
32e0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
32f0: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
3300: 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b-1]->nOp;.    }
3310: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
3320: 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20  iAddr<nOp );..  
3330: 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d    pRet = &aOp[p-
3340: 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e  >iAddr];.    p->
3350: 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28  iAddr++;.    if(
3360: 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29   p->iAddr==nOp )
3370: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b  {.      p->iSub+
3380: 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64  +;.      p->iAdd
3390: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  r = 0;.    }.  .
33a0: 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34      if( pRet->p4
33b0: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
33c0: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  RAM ){.      int
33d0: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75   nByte = (p->nSu
33e0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
33f0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
3400: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
3410: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b  (j=0; j<p->nSub;
3420: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
3430: 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d  f( p->apSub[j]==
3440: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3450: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
3460: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
3470: 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  p->nSub ){.     
3480: 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71     p->apSub = sq
3490: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
34a0: 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61  Free(v->db, p->a
34b0: 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pSub, nByte);.  
34c0: 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70        if( !p->ap
34d0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
34e0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
34f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3500: 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e      p->apSub[p->
3510: 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e  nSub++] = pRet->
3520: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
3530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3540: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
3550: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
3560: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70  * Check if the p
3570: 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e  rogram stored in
3580: 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74   the VM associat
3590: 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d  ed with pParse m
35a0: 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41  ay.** throw an A
35b0: 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28  BORT exception (
35c0: 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74  causing the stat
35d0: 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65  ement, but not e
35e0: 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
35f0: 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65  n.** to be rolle
3600: 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f  d back). This co
3610: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
3620: 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  if the main prog
3630: 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75  ram or any.** su
3640: 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61  b-programs conta
3650: 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66  ins any of the f
3660: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
3670: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
3680: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
3690: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
36a0: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
36b0: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69  OP_HaltIfNull wi
36c0: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
36d0: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
36e0: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
36f0: 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20   OP_Destroy.**  
3700: 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a   *  OP_VUpdate.*
3710: 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d  *   *  OP_VRenam
3720: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43  e.**   *  OP_FkC
3730: 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d  ounter with P2==
3740: 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  0 (immediate for
3750: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
3760: 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  int).**   *  OP_
3770: 43 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20  CreateTable and 
3780: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
3790: 20 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42   (for CREATE TAB
37a0: 4c 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  LE AS SELECT ...
37b0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
37c0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
37d0: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
37e0: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
37f0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
3800: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
3810: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
3820: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
3830: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
3840: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
3850: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
3860: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
3870: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
3880: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
3890: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
38a0: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
38b0: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
38c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
38d0: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
38e0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
38f0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
3900: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
3910: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
3920: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
3930: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
3940: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
3950: 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75  ;.  int hasFkCou
3960: 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nter = 0;.  int 
3970: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
3980: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69   0;.  int hasIni
3990: 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a  tCoroutine = 0;.
39a0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
39b0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
39c0: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
39d0: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
39e0: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
39f0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
3a00: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
3a10: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
3a20: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
3a30: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
3a40: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
3a50: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
3a60: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
3a70: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
3a80: 65 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  e .     || ((opc
3a90: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
3aa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
3ab0: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
3ac0: 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29   ((pOp->p1&0xff)
3ad0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
3ae0: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
3af0: 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29  OE_Abort)).    )
3b00: 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74  {.      hasAbort
3b10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
3b20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
3b30: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61   opcode==OP_Crea
3b40: 74 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65  teTable ) hasCre
3b50: 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ateTable = 1;.  
3b60: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3b70: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
3b80: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
3b90: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
3ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
3bb0: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
3bc0: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
3bd0: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
3be0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
3bf0: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
3c00: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
3c10: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
3c20: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
3c30: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
3c40: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
3c50: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
3c60: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
3c70: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
3c80: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
3c90: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
3ca0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
3cb0: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
3cc0: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
3cd0: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
3ce0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
3cf0: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
3d00: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
3d10: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
3d20: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
3d30: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
3d40: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
3d50: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
3d60: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
3d70: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
3d80: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
3d90: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
3da0: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
3db0: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
3dc0: 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43          || (hasC
3dd0: 72 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61  reateTable && ha
3de0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20  sInitCoroutine) 
3df0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
3e00: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
3e10: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
3e20: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
3e30: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  on */../*.** Thi
3e40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3e50: 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  led after all op
3e60: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
3e70: 69 6e 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f  inserted.  It lo
3e80: 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61  ops.** through a
3e90: 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61  ll the opcodes a
3ea0: 6e 64 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65  nd fixes up some
3eb0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
3ec0: 28 31 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d  (1) For each jum
3ed0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  p instruction wi
3ee0: 74 68 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  th a negative P2
3ef0: 20 76 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29   value (a label)
3f00: 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20  .**     resolve 
3f10: 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20  the P2 value to 
3f20: 61 6e 20 61 63 74 75 61 6c 20 61 64 64 72 65 73  an actual addres
3f30: 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d  s..**.** (2) Com
3f40: 70 75 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  pute the maximum
3f50: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
3f60: 65 6e 74 73 20 75 73 65 64 20 62 79 20 61 6e 79  ents used by any
3f70: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
3f80: 20 20 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74       and store t
3f90: 68 61 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d  hat value in *pM
3fa0: 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a  axFuncArgs..**.*
3fb0: 2a 20 28 33 29 20 55 70 64 61 74 65 20 74 68 65  * (3) Update the
3fc0: 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61   Vdbe.readOnly a
3fd0: 6e 64 20 56 64 62 65 2e 62 49 73 52 65 61 64 65  nd Vdbe.bIsReade
3fe0: 72 20 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72  r flags to accur
3ff0: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64  ately.**     ind
4000: 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20 70  icate what the p
4010: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
4020: 74 20 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e  t actually does.
4030: 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69  .**.** (4) Initi
4040: 61 6c 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64  alize the p4.xAd
4050: 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e  vance pointer on
4060: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 75 73   opcodes that us
4070: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20  e it..**.** (5) 
4080: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
4090: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
40a0: 20 73 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e   storing labels.
40b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
40c0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75  ine will only fu
40d0: 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79  nction correctly
40e0: 20 69 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   if the mkopcode
40f0: 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a  h.tcl generator.
4100: 2a 2a 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72  ** script number
4110: 73 20 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f  s the opcodes co
4120: 72 72 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65  rrectly.  Change
4130: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
4140: 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f  e must be.** coo
4150: 72 64 69 6e 61 74 65 64 20 77 69 74 68 20 63 68  rdinated with ch
4160: 61 6e 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64  anges to mkopcod
4170: 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69  eh.tcl..*/.stati
4180: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
4190: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
41a0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
41b0: 73 29 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72  s){.  int nMaxAr
41c0: 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72  gs = *pMaxFuncAr
41d0: 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  gs;.  Op *pOp;. 
41e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
41f0: 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   p->pParse;.  in
4200: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72  t *aLabel = pPar
4210: 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d  se->aLabel;.  p-
4220: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
4230: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
4240: 30 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  0;.  pOp = &p->a
4250: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20  Op[p->nOp-1];.  
4260: 77 68 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f  while(1){..    /
4270: 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f  * Only JUMP opco
4280: 64 65 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72  des and the shor
4290: 74 20 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61  t list of specia
42a0: 6c 20 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65  l opcodes in the
42b0: 20 73 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62   switch.    ** b
42c0: 65 6c 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20  elow need to be 
42d0: 63 6f 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65  considered.  The
42e0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
42f0: 65 6e 65 72 61 74 6f 72 20 73 63 72 69 70 74 20  enerator script 
4300: 67 72 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c  groups.    ** al
4310: 6c 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  l these opcodes 
4320: 74 6f 67 65 74 68 65 72 20 6e 65 61 72 20 74 68  together near th
4330: 65 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f  e front of the o
4340: 70 63 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69  pcode list.  Ski
4350: 70 0a 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63  p.    ** any opc
4360: 6f 64 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ode that does no
4370: 74 20 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e  t need processin
4380: 67 20 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20  g by virtual of 
4390: 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20  the fact that.  
43a0: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
43b0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58  r than SQLITE_MX
43c0: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73  _JUMP_OPCODE, as
43d0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
43e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20  ptimization..   
43f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
4400: 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f  >opcode<=SQLITE_
4410: 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29  MX_JUMP_OPCODE )
4420: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a  {.      /* NOTE:
4430: 20 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61   Be sure to upda
4440: 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  te mkopcodeh.tcl
4450: 20 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20   when adding or 
4460: 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a  removing.      *
4470: 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69  * cases from thi
4480: 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20  s switch! */.   
4490: 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e     switch( pOp->
44a0: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
44b0: 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61    case OP_Transa
44c0: 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20  ction: {.       
44d0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d     if( pOp->p2!=
44e0: 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  0 ) p->readOnly 
44f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  = 0;.          /
4500: 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * fall thru */. 
4510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4520: 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d   case OP_AutoCom
4530: 6d 69 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73  mit:.        cas
4540: 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20  e OP_Savepoint: 
4550: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
4560: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
4570: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4580: 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66         }.#ifndef
4590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
45a0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
45b0: 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e  _Checkpoint:.#en
45c0: 64 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65  dif.        case
45d0: 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20   OP_Vacuum:.    
45e0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72      case OP_Jour
45f0: 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20  nalMode: {.     
4600: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
4610: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
4620: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
4630: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4640: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
4650: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4660: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4670: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
4680: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
4690: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
46a0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
46b0: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
46c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
46d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
46e0: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
46f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
4700: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  t n;.          a
4710: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d  ssert( (pOp - p-
4720: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20  >aOp) >= 3 );.  
4730: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
4740: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
4750: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
4760: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
4770: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
4780: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
4790: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
47a0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
47b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
47c0: 69 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  if.        case 
47d0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
47e0: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f   case OP_NextIfO
47f0: 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73  pen:.        cas
4800: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
4810: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
4820: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
4830: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
4840: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
4850: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4860: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
4870: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4880: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4890: 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 20 20 63  _Prev:.        c
48a0: 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  ase OP_PrevIfOpe
48b0: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n: {.          p
48c0: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
48d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
48e0: 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20  evious;.        
48f0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4900: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
4910: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4930: 20 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65       if( (sqlite
4940: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
4950: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  pOp->opcode] & O
4960: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
4970: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
4980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
4990: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72  DR(pOp->p2)<pPar
49a0: 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  se->nLabel );.  
49b0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
49c0: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
49d0: 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  >p2)];.      }. 
49e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
49f0: 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b  ==p->aOp ) break
4a00: 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d  ;.    pOp--;.  }
4a10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4a20: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
4a30: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
4a40: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
4a50: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
4a60: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
4a70: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
4a80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
4a90: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
4aa0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4ab0: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
4ac0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4ad0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4ae0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
4af0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
4b00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4b10: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
4b20: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
4b30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4b40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
4b50: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
4b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
4b70: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
4b80: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
4b90: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
4ba0: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
4bb0: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
4bc0: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
4bd0: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
4be0: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
4bf0: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
4c00: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
4c10: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
4c20: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
4c30: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
4c40: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
4c50: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
4c60: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
4c70: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
4c80: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
4c90: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
4ca0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4cb0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
4cc0: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
4cd0: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
4ce0: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
4cf0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4d00: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
4d10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4d20: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
4d30: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
4d40: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
4d50: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
4d60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4d70: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
4d80: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
4d90: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4da0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4db0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
4dc0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
4dd0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
4de0: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
4df0: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
4e00: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
4e10: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
4e20: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
4e30: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
4e40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
4e50: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
4e60: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
4e70: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
4e80: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
4e90: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
4ea0: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
4eb0: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
4ec0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4ed0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
4ee0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
4ef0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
4f00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
4f10: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
4f20: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
4f30: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4f40: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
4f50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
4f60: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
4f70: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
4f80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4f90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4fa0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
4fb0: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
4fc0: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
4fd0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
4fe0: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
4ff0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5000: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
5010: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
5020: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
5030: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
5040: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
5050: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
5060: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
5070: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
5080: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5090: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
50a0: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
50b0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
50c0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
50d0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
50e0: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
50f0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
5100: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
5110: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
5120: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
5130: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
5140: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
5150: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
5160: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
5170: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
5180: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
5190: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
51a0: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
51b0: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
51c0: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
51d0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
51e0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
51f0: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
5200: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
5210: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
5220: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
5230: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
5240: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
5250: 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c  assert( DbMaskAl
5260: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
5270: 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  sk) );..  resolv
5280: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
5290: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
52a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
52b0: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
52c0: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
52d0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
52e0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
52f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
5300: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a  tack.  Return a.
5310: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
5320: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
5330: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
5340: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72  * Non-zero P2 ar
5350: 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20  guments to jump 
5360: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
5370: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
5380: 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68  djusted.** so th
5390: 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67  at the jump targ
53a0: 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74  et is relative t
53b0: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
53c0: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
53d0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
53e0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
53f0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74  /* Add opcodes t
5420: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
5430: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
5440: 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t nOp,          
5450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5460: 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20  mber of opcodes 
5470: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65  to add */.  Vdbe
5480: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
5490: 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p,       /* The 
54a0: 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64  opcodes to be ad
54b0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ded */.  int iLi
54c0: 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  neno            
54d0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d        /* Source-
54e0: 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  file line number
54f0: 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65   of first opcode
5500: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5510: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20    VdbeOp *pOut, 
5520: 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72  *pFirst;.  asser
5530: 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  t( nOp>0 );.  as
5540: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5550: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5560: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5570: 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73  + nOp > p->pPars
5580: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  e->nOpAlloc && g
5590: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f  rowOpArray(p, nO
55a0: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
55b0: 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74   0;.  }.  pFirst
55c0: 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f   = pOut = &p->aO
55d0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72  p[p->nOp];.  for
55e0: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
55f0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
5600: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f  {.    pOut->opco
5610: 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65  de = aOp->opcode
5620: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d  ;.    pOut->p1 =
5630: 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f   aOp->p1;.    pO
5640: 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32  ut->p2 = aOp->p2
5650: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f  ;.    assert( aO
5660: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
5670: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
5680: 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e  deProperty[aOp->
5690: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
56a0: 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d  JUMP)!=0 && aOp-
56b0: 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
56c0: 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f  Out->p2 += p->nO
56d0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  p;.    }.    pOu
56e0: 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b  t->p3 = aOp->p3;
56f0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70  .    pOut->p4typ
5700: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5710: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
5720: 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35   0;.    pOut->p5
5730: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
5740: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
5750: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
5760: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
5770: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
5780: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
5790: 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d  VERAGE.    pOut-
57a0: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
57b0: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
57c0: 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a   (void)iLineno;.
57d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
57e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
57f0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5800: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
5810: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
5820: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
5830: 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c  tOp(0, i+p->nOp,
5840: 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f   &p->aOp[i+p->nO
5850: 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p]);.    }.#endi
5860: 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b  f.  }.  p->nOp +
5870: 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = nOp;.  return 
5880: 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64  pFirst;.}..#if d
5890: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
58a0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
58b0: 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ATUS)./*.** Add 
58c0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
58d0: 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72  array of counter
58e0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c  s managed by sql
58f0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
5900: 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  atus()..*/.void 
5910: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
5920: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70  tatus(.  Vdbe *p
5930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5940: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74           /* VM t
5950: 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
5960: 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  () to */.  int a
5970: 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20  ddrExplain,     
5980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
5990: 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
59a0: 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20  ain (or 0) */.  
59b0: 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20  int addrLoop,   
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f  /* Address of lo
59e0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20  op counter */ . 
59f0: 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20   int addrVisit, 
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
5a20: 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e  ows visited coun
5a30: 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ter */.  LogEst 
5a40: 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  nEst,           
5a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
5a60: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
5a70: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
5a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5a90: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
5aa0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
5ab0: 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67  e or index being
5ac0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20   scanned */.){. 
5ad0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
5ae0: 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65  >nScan+1) * size
5af0: 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a  of(ScanStatus);.
5b00: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e    ScanStatus *aN
5b10: 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63  ew;.  aNew = (Sc
5b20: 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65  anStatus*)sqlite
5b30: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
5b40: 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74  , p->aScan, nByt
5b50: 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29  e);.  if( aNew )
5b60: 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73  {.    ScanStatus
5b70: 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70   *pNew = &aNew[p
5b80: 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20  ->nScan++];.    
5b90: 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69  pNew->addrExplai
5ba0: 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b  n = addrExplain;
5bb0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c  .    pNew->addrL
5bc0: 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a  oop = addrLoop;.
5bd0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69      pNew->addrVi
5be0: 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b  sit = addrVisit;
5bf0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20  .    pNew->nEst 
5c00: 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77  = nEst;.    pNew
5c10: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
5c20: 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c  3DbStrDup(p->db,
5c30: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e   zName);.    p->
5c40: 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20  aScan = aNew;.  
5c50: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
5c60: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
5c70: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
5c80: 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33  e, or P1, P2, P3
5c90: 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73  , or P5 operands
5ca0: 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66  .** for a specif
5cb0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
5cc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5cd0: 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
5ce0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5cf0: 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65  r, u8 iNewOpcode
5d00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5d10: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f  GetOp(p,addr)->o
5d20: 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f  pcode = iNewOpco
5d30: 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  de;.}.void sqlit
5d40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
5d50: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5d60: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5d70: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5d80: 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c  ,addr)->p1 = val
5d90: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5da0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
5db0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
5dc0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
5dd0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
5de0: 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a  ddr)->p2 = val;.
5df0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5e00: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
5e10: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
5e20: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5e30: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5e40: 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p3 = val;.}.
5e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5e60: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
5e70: 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73 73  , u16 p5){.  ass
5e80: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
5e90: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5ea0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5eb0: 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b  >nOp>0 ) p->aOp[
5ec0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70  p->nOp-1].p5 = p
5ed0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  5;.}../*.** Chan
5ee0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
5ef0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
5f00: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
5f10: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
5f20: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
5f30: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
5f40: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
5f50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5f60: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
5f70: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
5f80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5f90: 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d  geP2(p, addr, p-
5fa0: 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nOp);.}.../*.**
5fb0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75   If the input Fu
5fc0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
5fd0: 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68  is ephemeral, th
5fe0: 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a  en free it.  If.
5ff0: 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69  ** the FuncDef i
6000: 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20  s not ephermal, 
6010: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
6020: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6030: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
6040: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
6050: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  b, FuncDef *pDef
6060: 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e  ){.  if( (pDef->
6070: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
6080: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
6090: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
60a0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44 65  DbFreeNN(db, pDe
60b0: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
60c0: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
60d0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
60e0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
60f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
6100: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
6110: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ary..*/.static S
6120: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
6130: 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73 71  oid freeP4Mem(sq
6140: 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a  lite3 *db, Mem *
6150: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d  p){.  if( p->szM
6160: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
6170: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
6180: 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  lloc);.  sqlite3
6190: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
61a0: 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  .}.static SQLITE
61b0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66  _NOINLINE void f
61c0: 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c  reeP4FuncCtx(sql
61d0: 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65  ite3 *db, sqlite
61e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  3_context *p){. 
61f0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
6200: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46  nction(db, p->pF
6210: 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44 62  unc);. sqlite3Db
6220: 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d  FreeNN(db, p);.}
6230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
6240: 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eP4(sqlite3 *db,
6250: 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69   int p4type, voi
6260: 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74  d *p4){.  assert
6270: 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68  ( db );.  switch
6280: 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p4type ){.    
6290: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
62a0: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46   {.      freeP4F
62b0: 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69  uncCtx(db, (sqli
62c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29  te3_context*)p4)
62d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
62e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
62f0: 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20  _REAL:.    case 
6300: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61  P4_INT64:.    ca
6310: 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P4_DYNAMIC:. 
6320: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
6330: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
6340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6350: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
6360: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6370: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
6380: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
6390: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
63a0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
63b0: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b  f((KeyInfo*)p4);
63c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
63d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
63e0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
63f0: 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50  HINTS.    case P
6400: 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20  4_EXPR: {.      
6410: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6420: 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29  e(db, (Expr*)p4)
6430: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6440: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6450: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
6460: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68   {.      freeEph
6470: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
6480: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
6490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
64a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
64b0: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66  _MEM: {.      if
64c0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
64d0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
64e0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
64f0: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
6500: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  *)p4);.      }el
6510: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  se{.        free
6520: 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29  P4Mem(db, (Mem*)
6530: 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p4);.      }.   
6540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6550: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
6560: 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64   : {.      if( d
6570: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
6580: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
6590: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
65a0: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
65b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
65c0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
65d0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
65e0: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
65f0: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
6600: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
6610: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
6620: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
6630: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
6640: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
6650: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
6660: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
6670: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
6680: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
6690: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
66a0: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
66b0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
66c0: 20 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b     for(pOp=&aOp[
66d0: 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70  nOp-1]; pOp>=aOp
66e0: 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20  ; pOp--){.      
66f0: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  if( pOp->p4type 
6700: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
6710: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6720: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
6730: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6740: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
6750: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6760: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
6770: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
6780: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6790: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
67a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
67b0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
67c0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
67d0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
67e0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
67f0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
6800: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
6810: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
6820: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
6830: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
6840: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
6850: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
6860: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
6870: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6880: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
6890: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
68a0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
68b0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
68c0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
68d0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
68e0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
68f0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
6900: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
6910: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
6920: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6930: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
6940: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
6950: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
6960: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6970: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
6980: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
6990: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
69a0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
69b0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
69c0: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
69d0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
69e0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
69f0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
6a00: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
6a10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6a20: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
6a30: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
6a40: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
6a50: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
6a60: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
6a70: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
6a80: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
6a90: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
6aa0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
6ab0: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
6ac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
6ad0: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
6ae0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
6af0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
6b00: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
6b10: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
6b20: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
6b30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6b40: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
6b50: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
6b60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
6b80: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
6b90: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
6ba0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
6bb0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
6bc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
6bd0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
6be0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
6bf0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
6c00: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
6c10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
6c20: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
6c30: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
6c40: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
6c50: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
6c60: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
6c70: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
6c80: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
6c90: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
6ca0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
6cb0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
6cc0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
6cd0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
6ce0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
6cf0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
6d00: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
6d10: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
6d20: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
6d30: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
6d40: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
6d50: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
6d60: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
6d70: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
6d80: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
6d90: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
6da0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
6db0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
6dc0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
6dd0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
6de0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
6df0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
6e00: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
6e10: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
6e20: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
6e30: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
6e40: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
6e50: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
6e60: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
6e70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
6e80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
6e90: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
6ea0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
6eb0: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
6ec0: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
6ed0: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
6ee0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
6ef0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
6f00: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
6f10: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
6f20: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
6f30: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
6f40: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
6f50: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
6f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6f70: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
6f80: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
6f90: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
6fa0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
6fb0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6fc0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
6fd0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
6fe0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
6ff0: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
7000: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
7010: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
7020: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7030: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
7040: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
7050: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
7060: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
7070: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
7080: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
7090: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
70a0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
70b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
70c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
70d0: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
70e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
70f0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7100: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
7110: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
7120: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
7130: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
7140: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7150: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
7160: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
7170: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
7180: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
7190: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
71a0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
71b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
71c0: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
71d0: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
71e0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
71f0: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
7200: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
7210: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
7220: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
7230: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
7240: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
7250: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
7260: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
7270: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
7280: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
7290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
72a0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
72b0: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
72c0: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
72d0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
72e0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
72f0: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
7300: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
7310: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
7320: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
7330: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
7340: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
7350: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
7360: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
7370: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
7380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
7390: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
73a0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
73b0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
73c0: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
73d0: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
73e0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
73f0: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
7400: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
7410: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
7420: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
7430: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
7440: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
7450: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
7460: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
7470: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
7480: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
7490: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
74a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
74b0: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
74c0: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
74d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
74e0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
74f0: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
7500: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
7510: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
7520: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
7530: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
7540: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
7550: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7560: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
7570: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
7580: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
7590: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
75a0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
75b0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
75c0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
75d0: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
75e0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
75f0: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
7600: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7610: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
7620: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
7630: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7640: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
7650: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
7660: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
7670: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
7680: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
7690: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
76a0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
76b0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
76c0: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
76d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
76e0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
76f0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
7700: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
7710: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
7720: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
7730: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
7740: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
7750: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
7760: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
7770: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
7780: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
7790: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
77a0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
77b0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
77c0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
77d0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
77e0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
77f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
7800: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
7810: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
7820: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
7830: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
7840: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
7850: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
7860: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
7870: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
7880: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
7890: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
78a0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
78b0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
78c0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
78d0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
78e0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
78f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
7900: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
7910: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
7920: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
7930: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
7940: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
7950: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7960: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
7970: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
7980: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
7990: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
79a0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
79b0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
79c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
79d0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
79e0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
79f0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
7a00: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
7a10: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
7a20: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7a30: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
7a40: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7a50: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
7a60: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
7a70: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
7a80: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
7a90: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
7aa0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
7ab0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
7ac0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
7ad0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
7ae0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
7af0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
7b00: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
7b10: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
7b20: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
7b30: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
7b40: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
7b50: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
7b60: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
7b70: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
7b80: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
7b90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7ba0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
7bb0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
7bc0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
7bd0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
7be0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
7bf0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
7c00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7c10: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
7c20: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
7c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
7c40: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
7c50: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
7c60: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7c70: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
7c80: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
7c90: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
7ca0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
7cb0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
7cc0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
7cd0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
7ce0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7cf0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
7d00: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
7d10: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
7d20: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
7d30: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
7d40: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
7d50: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
7d60: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
7d70: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
7d80: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
7d90: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
7da0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
7db0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
7dc0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
7dd0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
7de0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
7df0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
7e00: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
7e10: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
7e20: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
7e30: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
7e40: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
7e50: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
7e60: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
7e70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7e80: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
7e90: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
7ea0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
7eb0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
7ec0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
7ed0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
7ee0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
7ef0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
7f00: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
7f10: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
7f20: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
7f30: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
7f40: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
7f50: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
7f60: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
7f70: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
7f80: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
7f90: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
7fa0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
7fb0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
7fc0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
7fd0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
7fe0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
7ff0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
8000: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
8010: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
8020: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
8030: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
8040: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
8050: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
8060: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
8070: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
8080: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
8090: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
80a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
80b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
80c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
80d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
80e0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
80f0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
8100: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
8110: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
8120: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8130: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8140: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
8150: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
8160: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
8170: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
8180: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
8190: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
81a0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
81b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
81c0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
81d0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
81e0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
81f0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
8200: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
8210: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
8220: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
8230: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
8240: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
8250: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
8260: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
8270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8280: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
8290: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
82a0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
82b0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
82c0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
82d0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
82e0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
82f0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
8300: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
8310: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
8320: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
8330: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
8340: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
8350: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
8360: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
8370: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
8380: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
8390: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
83a0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
83b0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
83c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
83d0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
83e0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
83f0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
8400: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
8410: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
8420: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
8430: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
8440: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
8450: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
8460: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
8470: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
8480: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
8490: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
84a0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
84b0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
84c0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
84d0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
84e0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
84f0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
8500: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
8510: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
8520: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
8530: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
8540: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
8550: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
8560: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
8570: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
8580: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
8590: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
85a0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
85b0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
85c0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
85d0: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
85e0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
85f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
8600: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8610: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
8620: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8630: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
8640: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
8650: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
8660: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
8670: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
8680: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
8690: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
86a0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
86b0: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
86c0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
86d0: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
86e0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
86f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8700: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8710: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
8720: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
8730: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
8740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8760: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
8770: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
8780: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
8790: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
87a0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
87b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
87c0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
87d0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
87e0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
87f0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
8800: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
8810: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
8820: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
8830: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
8840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8850: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8860: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
8870: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
8880: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
8890: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
88a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
88b0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
88c0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
88d0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
88e0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
88f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8900: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
8910: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
8920: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
8930: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
8940: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8950: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8960: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
8970: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8980: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
8990: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
89a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
89b0: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
89c0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
89d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
89e0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
89f0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
8a00: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
8a10: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
8a20: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
8a30: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8a40: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
8a60: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
8a70: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
8a80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8a90: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
8aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8ab0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8ac0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8ad0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
8ae0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
8af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
8b00: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
8b10: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
8b20: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
8b30: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
8b40: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
8b50: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
8b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8b70: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
8b80: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
8b90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8ba0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
8bb0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
8bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
8bd0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
8be0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
8bf0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
8c00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8c10: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8c20: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
8c30: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
8c40: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
8c50: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
8c60: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
8c70: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
8c80: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
8c90: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
8ca0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
8cb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8cc0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
8cd0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
8ce0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
8cf0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
8d00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8d10: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
8d20: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
8d30: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
8d40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
8d50: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
8d60: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
8d70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8d80: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
8d90: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
8da0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
8db0: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
8dc0: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
8dd0: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
8de0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
8df0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
8e00: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
8e10: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
8e20: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
8e30: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
8e40: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
8e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8e60: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
8e70: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
8e80: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
8e90: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
8ea0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c  XPrintf(p, "%Q",
8eb0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
8ec0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8ed0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8ee0: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
8ef0: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64  e3XPrintf(p, "%d
8f00: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
8f10: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
8f20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
8f30: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
8f40: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c  3XPrintf(p, "NUL
8f50: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
8f60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
8f70: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
8f80: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8f90: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72  , "r[%d]", pExpr
8fa0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
8fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8fc0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
8fd0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
8fe0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
8ff0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9000: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77  3XPrintf(p, "row
9010: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
9020: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9030: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25  e3XPrintf(p, "c%
9040: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
9050: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
9060: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9070: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9080: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
9090: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
90a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
90b0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
90c0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
90d0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
90e0: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
90f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9100: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
9110: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
9120: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9130: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
9140: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
9150: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9160: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
9170: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
9180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
9190: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
91a0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
91b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
91c0: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
91d0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
91e0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
91f0: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
9200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9210: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
9220: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
9230: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9240: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
9250: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
9260: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9270: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
9280: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
9290: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
92a0: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
92b0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
92c0: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
92d0: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
92e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
92f0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
9300: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
9310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9320: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
9330: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
9340: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9350: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
9360: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
9370: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
9380: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
9390: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
93a0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
93b0: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
93c0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
93d0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
93e0: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
93f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9400: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
9410: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
9420: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9430: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
9440: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
9450: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
9460: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
9470: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
9480: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9490: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
94a0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
94b0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
94c0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
94d0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
94e0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
94f0: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
9500: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
9510: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
9520: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
9530: 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20  ", "expr");.    
9540: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
9550: 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73  if( zOp ){.    s
9560: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9570: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
9580: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
9590: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
95a0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
95b0: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
95c0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
95d0: 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  Append(p, ",", 1
95e0: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
95f0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
9600: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
9610: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9620: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22  cumAppend(p, ")"
9630: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
9640: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
9650: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
9660: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9670: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
9680: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
9690: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
96a0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
96b0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
96c0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
96d0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
96e0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
96f0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
9700: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
9710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9720: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
9730: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
9740: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
9750: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
9760: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
9770: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
9780: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
9790: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
97a0: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
97b0: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
97c0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
97d0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
97e0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
97f0: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
9800: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
9810: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
9820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
9830: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
9840: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
9850: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9860: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
9870: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
9880: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
9890: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
98a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
98b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
98c0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
98d0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
98e0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
98f0: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
9900: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
9910: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f    if( strcmp(zCo
9920: 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30  ll, "BINARY")==0
9930: 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a   ) zColl = "B";.
9940: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9950: 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 73 25  Printf(&x, ",%s%
9960: 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  s", pKeyInfo->aS
9970: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d  ortOrder[j] ? "-
9980: 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a  " : "", zColl);.
9990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
99a0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
99b0: 65 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b  end(&x, ")", 1);
99c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
99d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
99e0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
99f0: 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50  HINTS.    case P
9a00: 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20  4_EXPR: {.      
9a10: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78  displayP4Expr(&x
9a20: 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29  , pOp->p4.pExpr)
9a30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9a40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9a50: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
9a60: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
9a70: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
9a80: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
9a90: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9aa0: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
9ab0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
9ac0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9ad0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
9ae0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
9af0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
9b00: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
9b10: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9b20: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
9b30: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
9b40: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
9b50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  eak;.    }.#if d
9b60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
9b70: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
9b80: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
9b90: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
9ba0: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
9bb0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
9bc0: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
9bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9be0: 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29  intf(&x, "%s(%d)
9bf0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
9c00: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
9c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c20: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9c30: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
9c40: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9c50: 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f  (&x, "%lld", *pO
9c60: 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20  p->p4.pI64);.   
9c70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c80: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33      case P4_INT3
9c90: 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2: {.      sqlit
9ca0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9cb0: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
9cc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9cd0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
9ce0: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
9cf0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9d00: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
9d10: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
9d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9d30: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
9d40: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
9d50: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
9d60: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
9d70: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
9d80: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
9d90: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
9da0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9db0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
9dc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9dd0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9de0: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
9df0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9e00: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9e10: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
9e20: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9e30: 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  tf(&x, "%.16g", 
9e40: 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  pMem->u.r);.    
9e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
9e60: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
9e70: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  ll ){.        zP
9e80: 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20  4 = "NULL";.    
9e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9ea0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
9eb0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
9ec0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
9ed0: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
9ee0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
9ef0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
9f00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9f10: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
9f20: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
9f30: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
9f40: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
9f50: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
9f60: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9f70: 66 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c  f(&x, "vtab:%p",
9f80: 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62   pVtab);.      b
9f90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9fa0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
9fb0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
9fc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
9fd0: 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e  t *ai = pOp->p4.
9fe0: 61 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  ai;.      int n 
9ff0: 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68  = ai[0];   /* Th
a000: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
a010: 6f 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69  of an INTARRAY i
a020: 73 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20  s always the.   
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20      ** count of 
a050: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
a060: 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77  ements to follow
a070: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
a080: 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<n; i++){.  
a090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a0a0: 69 6e 74 66 28 26 78 2c 20 22 2c 25 64 22 2c 20  intf(&x, ",%d", 
a0b0: 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ai[i]);.      }.
a0c0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
a0d0: 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69   '[';.      sqli
a0e0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
a0f0: 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20  d(&x, "]", 1);. 
a100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a110: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
a120: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
a130: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
a140: 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  (&x, "program");
a150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a160: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
a170: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
a180: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
a190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a1a0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54 41  }.    case P4_TA
a1b0: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
a1c0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a1d0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54  "%s", pOp->p4.pT
a1e0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a1f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a200: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
a210: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
a220: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
a230: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
a240: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
a250: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
a260: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
a270: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  }.  }.  sqlite3S
a280: 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78  trAccumFinish(&x
a290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34  );.  assert( zP4
a2a0: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
a2b0: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  zP4;.}.#endif /*
a2c0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
a2d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61   */../*.** Decla
a2e0: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
a2f0: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
a300: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
a310: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
a320: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
a330: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
a340: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
a350: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
a360: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
a370: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
a380: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
a390: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
a3a0: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
a3b0: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
a3c0: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
a3d0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
a3e0: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
a3f0: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
a400: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
a410: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
a420: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
a430: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
a440: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
a450: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
a460: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
a470: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
a480: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
a490: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
a4a0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
a4b0: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
a4c0: 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e  .  DbMaskSet(p->
a4d0: 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20  btreeMask, i);. 
a4e0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
a4f0: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
a500: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
a510: 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61  pBt) ){.    DbMa
a520: 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  skSet(p->lockMas
a530: 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  k, i);.  }.}..#i
a540: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a550: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
a560: 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  CHE)./*.** If SQ
a570: 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
a580: 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72   to support shar
a590: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e  ed-cache mode an
a5a0: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
a5b0: 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  fe,.** this rout
a5c0: 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20  ine obtains the 
a5d0: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
a5e0: 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61   with each BtSha
a5f0: 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  red structure.**
a600: 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63   that may be acc
a610: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20  essed by the VM 
a620: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a630: 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20  ument. In doing 
a640: 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65  so it also.** se
a650: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
a660: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
a670: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
a680: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
a690: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
a6a0: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
a6b0: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
a6c0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
a6d0: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
a6e0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
a6f0: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
a700: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
a710: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
a720: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
a730: 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e  reeEnter() is in
a740: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65  voked to set the
a750: 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72   BtShared.db var
a760: 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c  iables.** of all
a770: 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72   of BtShared str
a780: 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62  uctures accessib
a790: 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62  le via the datab
a7a0: 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61  ase handle .** a
a7b0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
a7c0: 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  he VM..**.** If 
a7d0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
a7e0: 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65  readsafe and doe
a7f0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
a800: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
a810: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
a820: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
a830: 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65  .** The p->btree
a840: 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20  Mask field is a 
a850: 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62  bitmask of all b
a860: 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70  trees that the p
a870: 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74  repared .** stat
a880: 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65  ement p will eve
a890: 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65  r use.  Let N be
a8a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
a8b0: 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  its in p->btreeM
a8c0: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
a8d0: 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74  ding to btrees t
a8e0: 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
a8f0: 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20  ache.  Then the 
a900: 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  runtime of.** th
a910: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a  is routine is N*
a920: 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20  N.  But as N is 
a930: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
a940: 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20   1, this should 
a950: 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62  not.** be a prob
a960: 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
a970: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64  ite3VdbeEnter(Vd
a980: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
a990: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
a9a0: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
a9b0: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
a9c0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
a9d0: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
a9e0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
a9f0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
aa00: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
aa10: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
aa20: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
aa30: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
aa40: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
aa50: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
aa60: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
aa70: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
aa80: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
aa90: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44  te3BtreeEnter(aD
aaa0: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
aab0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
aac0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
aad0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
aae0: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
aaf0: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
ab00: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66  ** Unlock all of
ab10: 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76   the btrees prev
ab20: 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79  iously locked by
ab30: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
ab40: 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a  e3VdbeEnter()..*
ab50: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
ab60: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64  NOINLINE void vd
ab70: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
ab80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
ab90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
aba0: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
abb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
abc0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
abd0: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
abe0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
abf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
ac00: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
ac10: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
ac20: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
ac30: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
ac40: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ac50: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
ac60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
ac70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
ac80: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
ac90: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
aca0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
acb0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
acc0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
acd0: 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b  .  vdbeLeave(p);
ace0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
acf0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
ad00: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
ad10: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
ad20: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
ad30: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
ad40: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
ad50: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
ad60: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
ad70: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
ad80: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
ad90: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
ada0: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
adb0: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
adc0: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
add0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
ade0: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
adf0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
ae00: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
ae10: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
ae20: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
ae30: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
ae40: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
ae50: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
ae60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ae70: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
ae80: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
ae90: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
aea0: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
aeb0: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
aec0: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
aed0: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
aee0: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
aef0: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
af00: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
af10: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
af20: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
af30: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
af40: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
af50: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
af60: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
af70: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
af80: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
af90: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
afa0: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
afb0: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
afc0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
afd0: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
afe0: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
aff0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
b000: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
b010: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
b020: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
b030: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
b040: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
b050: 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  lement..*/.stati
b060: 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72  c void initMemAr
b070: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
b080: 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  N, sqlite3 *db, 
b090: 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77 68  u16 flags){.  wh
b0a0: 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a  ile( (N--)>0 ){.
b0b0: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
b0c0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66      p->flags = f
b0d0: 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d  lags;.    p->szM
b0e0: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65  alloc = 0;.#ifde
b0f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
b100: 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d     p->pScopyFrom
b110: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
b120: 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   p++;.  }.}../*.
b130: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
b140: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
b150: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
b160: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
b170: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
b180: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
b190: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
b1a0: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
b1b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
b1c0: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  >db;.    if( db-
b1d0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
b1e0: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
b1f0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
b200: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
b210: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
b220: 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  c);.      }while
b230: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
b240: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b250: 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
b260: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
b270: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
b280: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20  db==p[1].db );. 
b290: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
b2a0: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
b2b0: 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b  Invariants(p) );
b2c0: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
b2d0: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
b2e0: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
b2f0: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
b300: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
b310: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
b320: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
b330: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
b340: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
b350: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
b360: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
b370: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
b380: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
b390: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
b3a0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
b3b0: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
b3c0: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
b3d0: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
b3e0: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
b3f0: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
b400: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
b410: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
b420: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
b430: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
b440: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
b450: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
b460: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
b470: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
b480: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
b490: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
b4a0: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
b4b0: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
b4c0: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
b4d0: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
b4e0: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
b4f0: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
b500: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
b510: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
b520: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
b530: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
b540: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
b550: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
b560: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
b570: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
b580: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
b590: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b5a0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
b5b0: 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a  gs & MEM_Agg );.
b5c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b5d0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  p->flags & MEM_D
b5e0: 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  yn );.      test
b5f0: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
b600: 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20   MEM_Frame );.  
b610: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b620: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
b630: 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Set );.      if(
b640: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
b650: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
b660: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
b670: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b680: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
b690: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
b6a0: 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  e if( p->szMallo
b6b0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
b6c0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
b6d0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
b6e0: 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f        p->szMallo
b6f0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
b700: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
b710: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
b720: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
b730: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a  )<pEnd );.  }.}.
b740: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
b750: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
b760: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
b770: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
b780: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
b790: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
b7a0: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
b7b0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
b7c0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
b7d0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
b7e0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
b7f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
b800: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
b810: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
b820: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
b830: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
b840: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
b850: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
b860: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
b870: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
b880: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
b890: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
b8a0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
b8b0: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
b8c0: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
b8d0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
b8e0: 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62  AuxData(p->v->db
b8f0: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
b900: 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  -1, 0);.  sqlite
b910: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
b920: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
b930: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
b940: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
b950: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
b960: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
b970: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
b980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
b990: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
b9a0: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
b9b0: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
b9c0: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
b9d0: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
b9e0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
b9f0: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
ba00: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
ba10: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
ba20: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
ba30: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
ba40: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
ba50: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
ba60: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
ba70: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
ba80: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
ba90: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
baa0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
bab0: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
bac0: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
bad0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
bae0: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
baf0: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
bb00: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
bb10: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
bb20: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
bb30: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
bb40: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
bb50: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
bb60: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
bb70: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
bb80: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
bb90: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
bba0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
bbb0: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bbd0: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
bbe0: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
bc10: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
bc20: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
bc30: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bc60: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
bc70: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
bc80: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
bc90: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bca0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
bcb0: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
bcc0: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
bcf0: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
bd00: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
bd10: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
bd40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
bd50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bd80: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
bd90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
bdc0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
bdd0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
bde0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
bdf0: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
be00: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
be10: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
be20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
be30: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
be40: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
be50: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
be60: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
be70: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
be80: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
be90: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
bea0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
beb0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
bec0: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
bed0: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
bee0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
bef0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
bf00: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
bf10: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
bf20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
bf30: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
bf40: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
bf50: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
bf60: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
bf70: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
bf80: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
bf90: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
bfa0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
bfb0: 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  PT ){.    /* Thi
bfc0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
bfd0: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
bfe0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
bff0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
c000: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
c010: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
c020: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
c030: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
c040: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
c050: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c060: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
c070: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
c080: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
c090: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
c0a0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
c0b0: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
c0c0: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
c0d0: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
c0e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
c0f0: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
c100: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
c110: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
c120: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
c130: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
c140: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
c150: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
c160: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
c170: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
c180: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
c190: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
c1a0: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
c1b0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
c1c0: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
c1d0: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
c1e0: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
c1f0: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
c200: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
c210: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
c220: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
c230: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
c240: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
c250: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
c260: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
c270: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
c280: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
c290: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
c2a0: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
c2b0: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
c2c0: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
c2d0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
c2e0: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
c2f0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
c300: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
c310: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
c320: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
c330: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
c340: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
c350: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
c360: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
c370: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
c380: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
c390: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
c3a0: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
c3b0: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
c3c0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
c3d0: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
c3e0: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
c3f0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
c400: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
c410: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
c420: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
c430: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
c440: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
c450: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
c460: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
c470: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
c480: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
c490: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
c4a0: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
c4b0: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
c4c0: 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c  <nRow && p->expl
c4d0: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
c4e0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
c4f0: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
c500: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70  i>=nRow ){.    p
c510: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
c520: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
c530: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
c540: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
c550: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
c560: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
c570: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
c580: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
c590: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c5a0: 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33  Error(p, sqlite3
c5b0: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
c5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
c5d0: 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a  r *zP4;.    Op *
c5e0: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
c5f0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
c600: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
c610: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
c620: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
c630: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
c640: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
c650: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
c660: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
c670: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
c680: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
c690: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
c6a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
c6b0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
c6c0: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
c6d0: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
c6e0: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
c6f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
c700: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
c710: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
c720: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
c730: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
c740: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
c750: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
c760: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
c770: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
c780: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
c790: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
c7a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c7b0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
c7c0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7f0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
c800: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
c810: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
c820: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
c830: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
c840: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
c850: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
c860: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
c870: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20  Op->opcode); /* 
c880: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
c890: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
c8a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
c8b0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
c8c0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
c8d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
c8e0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
c8f0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
c900: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
c910: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
c920: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
c930: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
c940: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
c950: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
c960: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
c970: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
c980: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
c990: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
c9a0: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
c9b0: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
c9c0: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
c9d0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
c9e0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
c9f0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
ca00: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
ca10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
ca20: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
ca30: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
ca40: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
ca50: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
ca60: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
ca70: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
ca80: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
ca90: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
caa0: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
cab0: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
cac0: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
cad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cae0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
caf0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
cb00: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
cb10: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
cb20: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
cb30: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
cb40: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
cb50: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  ;.          apSu
cb60: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
cb70: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
cb80: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
cb90: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
cba0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
cbb0: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
cbc0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
cbd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cbe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
cbf0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
cc00: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
cc10: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
cc40: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
cc50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
cc60: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
cc70: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
cca0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
ccb0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ccc0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
ccd0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
cce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ccf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
cd00: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
cd10: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
cd20: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
cd30: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29  esize(pMem, 100)
cd40: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
cd50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
cd60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cd70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
cd80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
cd90: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
cda0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
cdb0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
cdc0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
cdd0: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73  pMem->z, pMem->s
cde0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  zMalloc);.    if
cdf0: 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29  ( zP4!=pMem->z )
ce00: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  {.      pMem->n 
ce10: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
ce20: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
ce30: 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53  pMem, zP4, -1, S
ce40: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
ce50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ce60: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
ce70: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
ce80: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
ce90: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
cea0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
ceb0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
cec0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b      }.    pMem++
ced0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
cee0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
cef0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
cf00: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
cf10: 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20  ze(pMem, 4) ){. 
cf20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cf30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
cf40: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
cf50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
cf60: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
cf70: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
cf80: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
cf90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
cfa0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
cfb0: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
cfc0: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
cfd0: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
cfe0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
cff0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
d000: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
d010: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
d020: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
d030: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
d040: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
d050: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
d060: 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20  (pMem, 500) ){. 
d070: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d080: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
d090: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
d0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
d0b0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
d0c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
d0d0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
d0e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
d0f0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
d100: 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e  pOp, zP4, pMem->
d110: 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70  z, 500);.      p
d120: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
d130: 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20  E_UTF8;.#else.  
d140: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
d150: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
d180: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
d190: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
d1a0: 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c  = 8 - 4*(p->expl
d1b0: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70  ain-1);.    p->p
d1c0: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
d1d0: 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e  aMem[1];.    p->
d1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d1f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d200: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
d210: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
d220: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
d230: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
d240: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
d250: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
d260: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
d270: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
d280: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
d290: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
d2a0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
d2b0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
d2c0: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  z = 0;.  if( p->
d2d0: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20  zSql ){.    z = 
d2e0: 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65  p->zSql;.  }else
d2f0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29   if( p->nOp>=1 )
d300: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65  {.    const Vdbe
d310: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
d320: 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f  p[0];.    if( pO
d330: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
d340: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
d350: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
d360: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
d370: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
d380: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
d390: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d3a0: 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51  ( z ) printf("SQ
d3b0: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
d3c0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
d3d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d3e0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
d3f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
d400: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
d410: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
d420: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
d430: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
d440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d450: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
d460: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
d470: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
d480: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
d490: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
d4a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
d4b0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
d4c0: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
d4d0: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
d4e0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
d4f0: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
d500: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
d510: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
d520: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
d530: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
d540: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
d550: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
d560: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
d570: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
d580: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
d590: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
d5a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
d5b0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
d5c0: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
d5d0: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
d5e0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
d5f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d610: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
d620: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d630: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
d640: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
d650: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
d660: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
d670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
d680: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
d690: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
d6a0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
d6b0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73   this object des
d6c0: 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f  cribes bulk memo
d6d0: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
d6e0: 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f   use.** by subco
d6f0: 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72  mponents of a pr
d700: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
d710: 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f  .  Space is allo
d720: 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20  cated out.** of 
d730: 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  a ReusableSpace 
d740: 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c  object by the al
d750: 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74 69  locSpace() routi
d760: 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72  ne below..*/.str
d770: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
d780: 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65  e {.  u8 *pSpace
d790: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76  ;          /* Av
d7a0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
d7b0: 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
d7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d7d0: 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d  s of available m
d7e0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
d7f0: 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20 20 20  Needed;         
d800: 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74  /* Total bytes t
d810: 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  hat could not be
d820: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b   allocated */.};
d830: 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f  ../* Try to allo
d840: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
d850: 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
d860: 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66  ed bulk memory f
d870: 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20  or pBuf.** from 
d880: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
d890: 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  e object.  Retur
d8a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
d8b0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  he allocated.** 
d8c0: 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73  memory on succes
d8d0: 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  s.  If insuffici
d8e0: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ent memory is av
d8f0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a  ailable in the.*
d900: 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  * ReusableSpace 
d910: 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65  object, increase
d920: 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
d930: 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61  ce.nNeeded.** va
d940: 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  lue by the amoun
d950: 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74  t needed and ret
d960: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
d970: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69  If pBuf is not i
d980: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
d990: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
d9a0: 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c  he memory has al
d9b0: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c  ready.** been al
d9c0: 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69  located by a pri
d9d0: 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  or call to this 
d9e0: 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74  routine, so just
d9f0: 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a   return a copy.*
da00: 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65  * of pBuf and le
da10: 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  ave ReusableSpac
da20: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  e unchanged..**.
da30: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f  ** This allocato
da40: 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f  r is employed to
da50: 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65   repurpose unuse
da60: 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65  d slots at the e
da70: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63  nd of the.** opc
da80: 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65  ode array of pre
da90: 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20  pared state for 
daa0: 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65  other memory nee
dab0: 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ds of the prepar
dac0: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  ed.** statement.
dad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dae0: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73  *allocSpace(.  s
daf0: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
db00: 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b  ace *p,  /* Bulk
db10: 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
db20: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
db30: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
db40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
db60: 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
db70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
dba0: 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a  ry needed */.){.
dbb0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
dbc0: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
dbd0: 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69  ->pSpace) );.  i
dbe0: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
dbf0: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
dc00: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
dc10: 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72   nByte <= p->nFr
dc20: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ee ){.      p->n
dc30: 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
dc40: 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e       pBuf = &p->
dc50: 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d  pSpace[p->nFree]
dc60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
dc70: 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d     p->nNeeded +=
dc80: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
dc90: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
dca0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
dcb0: 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
dcc0: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
dcd0: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
dce0: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
dcf0: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
dd00: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
dd10: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
dd20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
dd30: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
dd40: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
dd50: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
dd60: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
dd70: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
dd80: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
dd90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
dda0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ddb0: 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67  C_INIT || p->mag
ddc0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
ddd0: 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ESET );..  /* Th
dde0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
ddf0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
de00: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
de10: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
de20: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
de30: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
de40: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
de50: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
de60: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
de70: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
de80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
de90: 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  UG.  for(i=0; i<
dea0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
deb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
dec0: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
ded0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
dee0: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
def0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
df00: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
df10: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
df20: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
df30: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
df40: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
df50: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
df60: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
df70: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
df80: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
df90: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
dfa0: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
dfb0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
dfc0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
dfd0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
dfe0: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
dff0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
e000: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
e010: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
e020: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
e030: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
e040: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
e050: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
e060: 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
e070: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
e080: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
e090: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69   registers and i
e0a0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
e0b0: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
e0c0: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
e0d0: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
e0e0: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
e0f0: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
e100: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
e110: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
e120: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
e130: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
e140: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20   called exactly 
e150: 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72  once on each vir
e160: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
e170: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
e180: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
e190: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
e1a0: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
e1b0: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
e1c0: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
e1d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
e1e0: 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
e1f0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
e200: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
e210: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
e220: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e230: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
e240: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
e250: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
e260: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
e270: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
e280: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
e290: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
e2a0: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
e2b0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
e2c0: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
e2d0: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
e2e0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
e2f0: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
e300: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
e310: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
e320: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
e330: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
e340: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
e350: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
e360: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
e370: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
e3a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e3d0: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
e3e0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e400: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
e410: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
e420: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
e430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e440: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
e450: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
e460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e470: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e480: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
e490: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
e4a0: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e4c0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
e4d0: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
e4e0: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e500: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
e510: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
e520: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ams */.  int n; 
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e550: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72  counter */.  str
e560: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
e570: 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  e x;        /* R
e580: 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d  eusable bulk mem
e590: 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ory */..  assert
e5a0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
e5b0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
e5c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
e5d0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e5e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
e5f0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
e600: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
e610: 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
e620: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
e630: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
e640: 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
e650: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
e660: 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
e670: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
e680: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
e690: 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
e6a0: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
e6b0: 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f  .  /* Each curso
e6c0: 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20  r uses a memory 
e6d0: 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74  cell.  The first
e6e0: 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20   cursor (cursor 
e6f0: 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20  0) can.  ** use 
e700: 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73  aMem[0] which is
e710: 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75   not otherwise u
e720: 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  sed by the VDBE 
e730: 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61  program.  Alloca
e740: 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74  te.  ** space at
e750: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d   the end of aMem
e760: 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31  [] for cursors 1
e770: 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20   and greater..  
e780: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
e790: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
e7a0: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
e7b0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75  ursor;.  if( nCu
e7c0: 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e  rsor==0 && nMem>
e7d0: 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20  0 ) nMem++;  /* 
e7e0: 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30  Space for aMem[0
e7f0: 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73  ] even if not us
e800: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ed */..  /* Figu
e810: 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
e820: 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20  reusable memory 
e830: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  is available at 
e840: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
e850: 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79   ** opcode array
e860: 2e 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65  .  This extra me
e870: 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61  mory will be rea
e880: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68  llocated for oth
e890: 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  er elements.  **
e8a0: 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64   of the prepared
e8b0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
e8c0: 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69  .  n = ROUND8(si
e8d0: 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29  zeof(Op)*p->nOp)
e8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e8f0: 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64  * Bytes of opcod
e900: 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f  e memory used */
e910: 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28  .  x.pSpace = &(
e920: 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b  (u8*)p->aOp)[n];
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e940: 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20  * Unused opcode 
e950: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
e960: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
e970: 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63  LIGNMENT(x.pSpac
e980: 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20  e) );.  x.nFree 
e990: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61  = ROUNDDOWN8(pPa
e9a0: 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d  rse->szOpAlloc -
e9b0: 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f   n);  /* Bytes o
e9c0: 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  f unused memory 
e9d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e  */.  assert( x.n
e9e0: 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Free>=0 );.  ass
e9f0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
ea00: 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70  ALIGNMENT(&x.pSp
ea10: 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b  ace[x.nFree]) );
ea20: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
ea30: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
ea40: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
ea50: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
ea60: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
ea70: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
ea80: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
ea90: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
eaa0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
eab0: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70  em = 10;.  }.  p
eac0: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
ead0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
eae0: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
eaf0: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
eb00: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
eb10: 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20   in one or two. 
eb20: 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
eb30: 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
eb40: 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
eb50: 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74  unused memory at
eb60: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
eb70: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
eb80: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
eb90: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
eba0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
ebb0: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
ebc0: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
ebd0: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
ebe0: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
ebf0: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
ec00: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ill in the remai
ec10: 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65  nder using a fre
ec20: 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  sh memory alloca
ec30: 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
ec40: 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
ec50: 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
ec60: 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
ec70: 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
ec80: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
ec90: 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74  ftover memory at
eca0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ecb0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54  opcode array.  T
ecc0: 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63  his can signific
ecd0: 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
ece0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
ecf0: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
ed00: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
ed10: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
ed20: 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d  .    x.nNeeded =
ed30: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
ed40: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
ed50: 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73   p->aMem, nMem*s
ed60: 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20  izeof(Mem));.   
ed70: 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63   p->aVar = alloc
ed80: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61  Space(&x, p->aVa
ed90: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
eda0: 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  em));.    p->apA
edb0: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
edc0: 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41  &x, p->apArg, nA
edd0: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29  rg*sizeof(Mem*))
ede0: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d  ;.    p->apCsr =
edf0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
ee00: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
ee10: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
ee20: 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53  sor*));.#ifdef S
ee30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
ee40: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
ee50: 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
ee60: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
ee70: 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
ee80: 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
ee90: 69 66 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 65  if.    if( x.nNe
eea0: 65 64 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eded==0 ) break;
eeb0: 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20  .    x.pSpace = 
eec0: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
eed0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
eee0: 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a  db, x.nNeeded);.
eef0: 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e      x.nFree = x.
ef00: 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c  nNeeded;.  }whil
ef10: 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  e( !db->mallocFa
ef20: 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 70 56  iled );..  p->pV
ef30: 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70  List = pParse->p
ef40: 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d  VList;.  pParse-
ef50: 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20  >pVList =  0;.  
ef60: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
ef70: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
ef80: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ef90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  iled ){.    p->n
efa0: 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Var = 0;.    p->
efb0: 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  nCursor = 0;.   
efc0: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->nMem = 0;.  
efd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43  }else{.    p->nC
efe0: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
eff0: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
f000: 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
f010: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
f020: 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20  aVar, nVar, db, 
f030: 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70  MEM_Null);.    p
f040: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
f050: 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
f060: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64  p->aMem, nMem, d
f070: 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  b, MEM_Undefined
f080: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  );.    memset(p-
f090: 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73  >apCsr, 0, nCurs
f0a0: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
f0b0: 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
f0c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
f0d0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
f0e0: 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78    memset(p->anEx
f0f0: 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69  ec, 0, p->nOp*si
f100: 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
f110: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
f120: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
f130: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
f140: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
f150: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
f160: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
f170: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
f180: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
f190: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
f1a0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
f1b0: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
f1c0: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
f1d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f1e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
f1f0: 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43  x->pBtx==0 || pC
f200: 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  x->eCurType==CUR
f210: 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
f220: 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75  switch( pCx->eCu
f230: 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  rType ){.    cas
f240: 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  e CURTYPE_SORTER
f250: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f260: 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
f270: 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
f280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f290: 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
f2a0: 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20  E_BTREE: {.     
f2b0: 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65   if( pCx->isEphe
f2c0: 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  meral ){.       
f2d0: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29   if( pCx->pBtx )
f2e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
f2f0: 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20  se(pCx->pBtx);. 
f300: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
f310: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
f320: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
f330: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
f340: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
f350: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
f360: 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
f370: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
f380: 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
f390: 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
f3a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
f3b0: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
f3c0: 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
f3d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f3e0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
f3f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
f400: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
f410: 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
f420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
f430: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
f440: 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
f450: 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
f460: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
f470: 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
f480: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
f490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
f4a0: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
f4b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
f4c0: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
f4d0: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
f4e0: 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
f4f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f500: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
f510: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
f520: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
f530: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
f540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
f550: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
f560: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
f570: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
f580: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
f590: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
f5a0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
f5b0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
f5c0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
f5d0: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
f5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f5f0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
f600: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
f610: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
f620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
f630: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
f640: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
f650: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
f660: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
f670: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
f680: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
f690: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
f6a0: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
f6b0: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
f6c0: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
f6d0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
f6e0: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
f6f0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
f700: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
f710: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
f720: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
f730: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
f740: 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
f750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
f760: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
f770: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
f780: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
f790: 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  if.  v->aOp = pF
f7a0: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
f7b0: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
f7c0: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
f7d0: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
f7e0: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
f7f0: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
f800: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
f810: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
f820: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
f830: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
f840: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
f850: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
f860: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
f870: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e  ->nChange;.  v->
f880: 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46  db->nChange = pF
f890: 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b  rame->nDbChange;
f8a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
f8b0: 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64  leteAuxData(v->d
f8c0: 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c  b, &v->pAuxData,
f8d0: 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41   -1, 0);.  v->pA
f8e0: 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d  uxData = pFrame-
f8f0: 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72  >pAuxData;.  pFr
f900: 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20  ame->pAuxData = 
f910: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  0;.  return pFra
f920: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
f930: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
f940: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
f950: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
f960: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
f970: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
f980: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
f990: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
f9a0: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
f9b0: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
f9c0: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
f9d0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
f9e0: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
f9f0: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
fa00: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
fa10: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
fa20: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
fa30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fa40: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
fa50: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
fa60: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
fa70: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
fa80: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
fa90: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
faa0: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
fab0: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
fac0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
fad0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
fae0: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20  ore(pFrame);.   
faf0: 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
fb00: 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20      p->nFrame = 
fb10: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
fb20: 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b   p->nFrame==0 );
fb30: 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
fb40: 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28  nFrame(p);.  if(
fb50: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
fb60: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
fb70: 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
fb80: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
fb90: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
fba0: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
fbb0: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
fbc0: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
fbd0: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
fbe0: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
fbf0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
fc00: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
fc10: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
fc20: 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
fc30: 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
fc40: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78  */.  if( p->pAux
fc50: 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64  Data ) sqlite3Vd
fc60: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
fc70: 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  p->db, &p->pAuxD
fc80: 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  ata, -1, 0);.  a
fc90: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
fca0: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
fcb0: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
fcc0: 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  M after a single
fcd0: 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   run..*/.static 
fce0: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
fcf0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
fd00: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23   *db = p->db;..#
fd10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
fd20: 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
fd30: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
fd40: 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
fd50: 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
fd60: 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
fd70: 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
fd80: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
fd90: 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
fda0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  */.  int i;.  if
fdb0: 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
fdc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
fdd0: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
fde0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
fdf0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
fe00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
fe10: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
fe20: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
fe30: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55  [i].flags==MEM_U
fe40: 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a  ndefined );.  }.
fe50: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
fe60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
fe70: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
fe80: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
fe90: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
fea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
feb0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
fec0: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
fed0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
fee0: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
fef0: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
ff00: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
ff10: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
ff20: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
ff30: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
ff40: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
ff50: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
ff60: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
ff70: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
ff80: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
ff90: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
ffa0: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
ffb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
ffc0: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
ffd0: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
ffe0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
fff0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10000 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73  ;..  if( p->nRes
10010 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65  Column ){.    re
10020 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
10030 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
10040 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
10050 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  _N);.    sqlite3
10060 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
10070 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  olName);.  }.  n
10080 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
10090 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
100a0 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
100b0 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
100c0 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d  >aColName = (Mem
100d0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
100e0 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
100f0 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
10100 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
10110 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69   ) return;.  ini
10120 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  tMemArray(p->aCo
10130 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45  lName, n, db, ME
10140 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  M_Null);.}../*.*
10150 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
10160 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
10170 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
10180 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
10190 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
101a0 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
101b0 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
101c0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
101d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
101e0 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
101f0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
10200 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
10210 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
10220 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
10230 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
10240 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
10250 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
10260 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
10270 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
10280 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
10290 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
102a0 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
102b0 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
102c0 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
102d0 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
102e0 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
102f0 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
10300 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10310 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
10320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
10340 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
10350 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10380 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
10390 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
103a0 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
103d0 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
103e0 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
103f0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
10400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10410 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
10420 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
10430 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
10440 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
10450 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
10460 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
10470 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
10480 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10490 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
104a0 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
104b0 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
104c0 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
104d0 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
104e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
104f0 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
10500 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
10510 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
10520 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
10530 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
10540 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10550 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
10560 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
10570 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
10580 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
10590 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
105a0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
105b0 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
105c0 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
105d0 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
105e0 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
105f0 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
10600 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
10610 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
10620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
10630 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
10640 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
10650 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
10660 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
10670 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
10680 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
10690 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
106a0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
106b0 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
106c0 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
106d0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
106e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
106f0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
10700 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
10710 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
10720 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
10730 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
10740 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
10750 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
10760 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
10770 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
10780 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
10790 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
107a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20  -transaction.   
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64  ** that are cand
107d0 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f  idates for a two
107e0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73  -phase commit us
107f0 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20  ing a.          
10800 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74           ** mast
10810 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er-journal */.  
10820 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10830 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
10840 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
10850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10860 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
10870 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
10880 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
10890 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
108a0 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
108b0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
108c0 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
108d0 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
108e0 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
108f0 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
10900 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
10910 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
10920 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
10930 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
10940 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
10950 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
10960 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
10970 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
10980 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
10990 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
109a0 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
109b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
109c0 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
109d0 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
109e0 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
109f0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
10a00 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
10a10 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
10a20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
10a30 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
10a40 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
10a50 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
10a60 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
10a70 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
10a80 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
10a90 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
10aa0 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
10ab0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10ac0 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
10ad0 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
10ae0 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
10af0 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
10b00 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
10b10 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
10b20 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
10b30 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
10b40 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
10b50 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
10b60 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
10b70 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
10b80 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
10b90 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10ba0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10bb0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
10bc0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10bd0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
10be0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10bf0 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
10c00 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
10c10 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61   or not a databa
10c20 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  se might need a 
10c30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10c40 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20  epends upon.    
10c50 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c    ** its journal
10c60 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68   mode (among oth
10c70 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69  er things).  Thi
10c80 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69  s matrix determi
10c90 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  nes which.      
10ca0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  ** journal modes
10cb0 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f   use a master jo
10cc0 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20  urnal and which 
10cd0 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  do not */.      
10ce0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
10cf0 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a  aMJNeeded[] = {.
10d00 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54          /* DELET
10d10 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20  E   */  1,.     
10d20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20     /* PERSIST   
10d30 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
10d40 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c   OFF       */ 0,
10d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e  .        /* TRUN
10d60 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20  CATE  */ 1,.    
10d70 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20      /* MEMORY   
10d80 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
10d90 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30  * WAL       */ 0
10da0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
10db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
10dc0 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69   /* Pager associ
10dd0 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f  ated with pBt */
10de0 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
10df0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  it = 1;.      sq
10e00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10e10 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pBt);.      pPag
10e20 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
10e30 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
10e40 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
10e50 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ].safety_level!=
10e60 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
10e70 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20  S_OFF.       && 
10e80 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65  aMJNeeded[sqlite
10e90 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
10ea0 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20  Mode(pPager)].  
10eb0 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20      ){ .        
10ec0 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a  assert( i!=1 );.
10ed0 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b          nTrans++
10ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ef0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10f00 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
10f10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
10f20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10f30 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
10f40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10f60 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
10f70 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
10f80 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10f90 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
10fa0 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
10fb0 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
10fc0 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
10fd0 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
10fe0 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
10ff0 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
11000 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
11010 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11020 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11030 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
11040 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
11050 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
11060 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
11070 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
11080 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
11090 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
110a0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
110b0 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
110c0 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
110d0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
110e0 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
110f0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
11100 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
11110 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
11120 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
11130 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
11140 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
11150 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
11160 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
11170 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
11180 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
11190 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
111a0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
111b0 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
111c0 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
111d0 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
111e0 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
111f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
11200 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11210 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
11220 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
11230 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
11240 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
11250 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
11260 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
11270 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
11280 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11290 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
112a0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
112b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
112c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
112d0 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
112e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
112f0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
11300 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
11310 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
11320 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
11330 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
11340 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
11350 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
11360 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
11370 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
11380 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
11390 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
113a0 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
113b0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
113c0 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
113d0 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
113e0 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
113f0 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
11400 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
11410 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
11420 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
11430 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
11440 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
11450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11460 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11470 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11480 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
11490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
114a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
114b0 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
114c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
114d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
114e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
114f0 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
11500 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11510 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
11520 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
11530 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
11540 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
11550 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
11560 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
11570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
11580 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
11590 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
115a0 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
115b0 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
115c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
115d0 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
115e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
115f0 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
11600 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
11610 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
11620 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
11630 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
11640 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
11650 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
11660 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
11670 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
11680 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
11690 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
116a0 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
116b0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
116c0 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
116d0 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
116e0 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
116f0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
11700 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11710 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
11720 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
11730 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
11740 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
11750 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
11760 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
11770 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
11780 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
11790 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
117a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
117b0 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a  _BKPT;.    do {.
117c0 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
117d0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
117e0 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
117f0 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
11800 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
11810 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
11820 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
11830 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
11840 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
11850 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11860 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11870 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
11880 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
11890 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
118a0 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
118b0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
118c0 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
118d0 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
118e0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
118f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
11900 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
11910 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
11920 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
11930 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
11940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11950 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
11960 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
11970 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
11980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
119b0 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
119c0 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
119d0 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
119e0 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
119f0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11a00 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
11a10 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
11a20 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
11a30 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
11a40 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
11a50 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11a60 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
11a70 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
11a80 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
11a90 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
11aa0 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
11ab0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11ad0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
11ae0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
11af0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
11b00 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
11b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11b20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
11b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11b40 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
11b50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11b60 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
11b70 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
11b80 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
11b90 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
11ba0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11bb0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
11bc0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11bd0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
11be0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
11bf0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
11c00 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
11c10 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
11c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11c40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11c50 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
11c70 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
11c80 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
11c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11ca0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
11cb0 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
11cc0 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
11cd0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
11ce0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
11cf0 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
11d00 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
11d10 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
11d20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
11d30 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
11d40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
11d50 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
11d60 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
11d70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11d80 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
11d90 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
11da0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
11db0 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
11dc0 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
11dd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11de0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11df0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11e00 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11e10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
11e20 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
11e30 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
11e40 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
11e50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
11e60 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
11e70 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
11e80 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
11e90 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
11ea0 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
11eb0 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
11ec0 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
11ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
11ee0 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
11ef0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
11f00 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11f10 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
11f20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11f30 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
11f40 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
11f50 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
11f60 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
11f70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11f90 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11fa0 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11fc0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
11fd0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
11fe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11ff0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12000 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
12010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12020 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12030 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
12040 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12050 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
12060 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
12070 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
12080 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
12090 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
120a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30      */.    if( 0
120b0 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
120c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
120d0 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
120e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
120f0 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
12100 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
12110 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
12120 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
12130 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
12140 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12150 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
12160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12170 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
12180 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
12190 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
121a0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
121b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
121c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
121d0 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
121e0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
121f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
12200 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
12210 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
12220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
12230 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
12240 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
12250 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
12260 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
12270 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
12280 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12290 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
122a0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
122b0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
122c0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
122d0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
122e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
122f0 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
12300 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
12310 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
12320 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12330 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
12340 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
12350 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
12360 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
12370 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12380 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
12390 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
123a0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
123b0 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
123c0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
123d0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
123e0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
123f0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
12400 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
12410 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12420 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12430 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12450 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
12460 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
12470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12480 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12490 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
124a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
124b0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
124c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
124d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
124e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
124f0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
12500 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12510 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
12520 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12530 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
12540 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
12550 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
12560 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
12570 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
12580 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
12590 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
125a0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
125b0 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
125c0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
125d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
125e0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
125f0 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
12600 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12610 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
12620 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
12630 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12650 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
12660 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
12670 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
12680 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
12690 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
126a0 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
126b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
126c0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
126d0 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
126e0 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
126f0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
12700 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
12710 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
12720 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
12730 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
12740 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
12750 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
12760 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
12770 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
12780 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
12790 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
127a0 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
127b0 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
127c0 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
127d0 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
127e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
127f0 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
12800 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
12810 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
12820 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
12830 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
12840 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12860 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
12870 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12880 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12890 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
128a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
128b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
128c0 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
128d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
128e0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
128f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
12900 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12910 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
12920 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
12930 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
12940 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
12950 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
12960 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
12970 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
12980 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
12990 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
129a0 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
129b0 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
129c0 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
129d0 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
129e0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
129f0 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
12a00 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
12a10 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
12a20 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
12a30 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
12a40 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
12a50 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
12a60 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
12a70 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
12a80 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12a90 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
12aa0 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
12ab0 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
12ac0 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
12ad0 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
12ae0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
12af0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
12b00 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
12b10 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
12b20 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
12b30 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
12b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
12b50 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
12b60 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
12b70 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
12b80 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
12b90 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
12ba0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
12bb0 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
12bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
12bd0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12be0 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
12bf0 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
12c00 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
12c10 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
12c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
12c30 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
12c40 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
12c50 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
12c60 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
12c70 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
12c80 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
12c90 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12ca0 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
12cb0 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
12cc0 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
12cd0 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
12ce0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
12cf0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12d00 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
12d10 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
12d20 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
12d30 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
12d40 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
12d50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
12d60 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
12d70 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
12d80 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
12d90 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
12da0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
12db0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
12dc0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
12dd0 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
12de0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
12df0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12e00 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
12e10 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
12e20 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
12e30 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f  LINE int vdbeClo
12e40 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
12e50 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
12e60 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
12e70 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
12e80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12e90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
12ea0 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
12eb0 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
12ec0 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t-1;..  assert( 
12ed0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12ee0 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
12ef0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12f00 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  E);.  assert( db
12f10 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
12f20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
12f30 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
12f40 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
12f50 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
12f60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12f70 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
12f80 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
12f90 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  _OK;.    Btree *
12fa0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12fb0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
12fc0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t ){.      if( e
12fd0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
12fe0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
12ff0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
13000 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
13010 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
13020 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
13030 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
13040 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
13050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13060 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
13070 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
13080 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
13090 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
130a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
130b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
130c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
130d0 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
130e0 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53    }.  }.  db->nS
130f0 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d  tatement--;.  p-
13100 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
13110 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
13120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
13130 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
13140 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
13150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
13160 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
13170 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
13180 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
13190 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
131a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
131b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
131c0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
131d0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
131e0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
131f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
13200 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
13210 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13220 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
13230 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
13240 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ore the .  ** da
13250 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
13260 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
13270 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
13280 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
13290 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74  hen .  ** the st
132a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
132b0 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
132c0 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53   */.  if( eOp==S
132d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
132e0 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  K ){.    db->nDe
132f0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
13300 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
13310 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
13320 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
13330 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d  tDefImmCons;.  }
13340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13350 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
13360 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
13370 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
13380 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53  .  if( p->db->nS
13390 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
133a0 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
133b0 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73   return vdbeClos
133c0 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f  eStatement(p, eO
133d0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
133e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
133f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13400 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
13410 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
13420 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
13430 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
13440 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
13450 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
13460 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
13470 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
13480 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
13490 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
134a0 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
134b0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
134c0 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
134d0 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
134e0 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
134f0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
13500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
13510 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
13520 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
13530 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
13540 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
13550 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
13560 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
13570 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
13580 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
13590 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  EY.** and write 
135a0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
135b0 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
135c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
135d0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
135e0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
135f0 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
13600 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
13610 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
13620 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
13630 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
13640 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64   (deferred && (d
13650 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
13660 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  +db->nDeferredIm
13670 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c  mCons)>0) .   ||
13680 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
13690 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
136a0 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  0) .  ){.    p->
136b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
136c0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
136d0 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  Y;.    p->errorA
136e0 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
136f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13700 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49  eError(p, "FOREI
13710 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
13720 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
13730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13740 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
13750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
13760 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
13770 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13780 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
13790 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
137a0 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
137b0 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
137c0 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
137d0 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
137e0 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
137f0 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
13800 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
13810 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
13820 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
13830 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13840 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
13850 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
13860 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
13870 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
13880 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
13890 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
138a0 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
138b0 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
138c0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
138d0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
138e0 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
138f0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
13900 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
13910 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
13920 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
13930 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
13940 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
13950 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
13960 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
13970 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
13980 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
13990 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
139a0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
139b0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
139c0 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
139d0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
13a00 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
13a10 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
13a20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
13a30 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
13a40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
13a50 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
13a60 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
13a70 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
13a80 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
13a90 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
13aa0 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
13ab0 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
13ac0 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
13ad0 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
13ae0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
13af0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
13b00 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
13b10 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
13b20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
13b30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
13b40 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
13b50 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
13b60 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
13b70 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
13b80 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
13b90 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
13ba0 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
13bb0 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
13bc0 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
13bd0 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
13be0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
13bf0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
13c00 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
13c10 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
13c20 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
13c30 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
13c40 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
13c50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
13c60 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d    */..  if( p->m
13c70 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
13c80 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
13c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13ca0 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
13cb0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
13cc0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
13cd0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
13ce0 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
13cf0 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  (p);.  checkActi
13d00 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
13d10 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
13d20 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
13d30 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
13d40 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
13d50 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
13d60 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
13d70 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
13d80 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
13d90 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
13da0 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
13db0 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
13dc0 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
13dd0 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
13de0 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
13df0 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
13e00 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
13e10 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
13e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
13e30 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
13e40 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
13e50 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
13e60 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
13e70 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
13e80 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
13e90 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
13ea0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
13eb0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
13ec0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
13ed0 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
13ee0 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
13ef0 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
13f00 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
13f10 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
13f40 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
13f50 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
13f60 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
13f70 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
13f80 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
13f90 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
13fa0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
13fb0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
13fc0 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
13fd0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
13fe0 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
13ff0 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
14000 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
14010 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
14020 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
14030 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
14040 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
14050 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
14060 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
14070 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14080 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
14090 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
140a0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
140b0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
140c0 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
140d0 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
140e0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
140f0 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
14100 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
14110 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
14120 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
14130 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
14140 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
14150 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
14160 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
14170 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
14180 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
14190 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
141a0 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
141b0 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
141c0 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
141d0 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
141e0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
141f0 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
14200 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
14210 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
14220 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
14230 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
14240 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14250 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
14260 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
14270 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
14280 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
14290 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
142a0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
142b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
142c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
142d0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
142e0 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
142f0 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
14300 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
14310 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
14320 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
14330 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
14340 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
14350 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
14360 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
14370 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
14380 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14390 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
143a0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
143b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
143c0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
143d0 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
143e0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
143f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
14400 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14420 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
14430 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
14440 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
14450 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
14460 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14480 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
14490 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
144a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
144b0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
144c0 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
144d0 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
144e0 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
144f0 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
14500 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
14510 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
14520 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
14530 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
14540 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
14550 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
14560 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
14570 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
14580 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
14590 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
145a0 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
145b0 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
145c0 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
145d0 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
145e0 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
145f0 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
14600 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
14610 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
14620 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
14630 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
14640 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
14650 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
14660 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14670 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
14680 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
14690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
146a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
146b0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
146c0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
146d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
146e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
146f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14700 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
14710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14720 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
14730 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
14740 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
14750 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
14760 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
14770 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
14780 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
14790 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
147a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
147b0 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
147c0 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
147d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
147e0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
147f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
14800 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
14810 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
14820 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
14830 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
14840 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
14850 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
14860 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
14870 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
14880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
14890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
148a0 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
148b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
148c0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
148d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
148e0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
148f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
14900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14920 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
14930 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14940 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14950 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  E_OK);.         
14960 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14980 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
14990 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
149a0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
149b0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
149c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
149d0 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
149e0 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
149f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
14a00 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
14a10 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
14a20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
14a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14a40 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14a50 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
14a60 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14a70 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14a80 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
14a90 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
14aa0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
14ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
14ac0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14ad0 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
14ae0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
14af0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
14b00 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
14b10 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
14b20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
14b30 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
14b40 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
14b50 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
14b60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
14b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
14b90 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
14ba0 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
14bb0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
14bc0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
14bd0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
14be0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14bf0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
14c00 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14c10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14c20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
14c30 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
14c40 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
14c50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
14c60 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
14c70 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
14c80 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
14c90 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
14ca0 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
14cb0 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
14cc0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
14cd0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
14ce0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
14cf0 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
14d00 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
14d10 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
14d20 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
14d30 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
14d40 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
14d50 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
14d60 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
14d70 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
14d80 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
14d90 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
14da0 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
14db0 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
14dc0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14dd0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
14de0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
14df0 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
14e00 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
14e10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
14e20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
14e30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14e40 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
14e50 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
14e60 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
14e70 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
14e80 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
14e90 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
14ea0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
14eb0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
14ec0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14ed0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
14ee0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
14ef0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
14f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14f10 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
14f20 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
14f30 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
14f40 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
14f50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
14f60 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
14f70 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
14f80 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
14f90 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
14fa0 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
14fb0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
14fc0 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
14fd0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
14fe0 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
14ff0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
15000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
15010 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
15020 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
15030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
15040 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
15050 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
15060 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
15070 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
15080 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
15090 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
150a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
150b0 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
150c0 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
150d0 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
150e0 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
150f0 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
15100 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
15110 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
15120 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
15130 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
15140 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
15150 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
15160 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
15170 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
15180 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
15190 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
151a0 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
151b0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
151c0 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
151d0 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
151e0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
151f0 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
15200 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
15210 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
15220 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
15230 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62  nt(db);.  if( db
15240 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15250 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
15260 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15280 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
15290 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
152a0 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
152b0 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
152c0 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
152d0 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
152e0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
152f0 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
15300 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
15310 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
15320 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
15330 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
15340 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
15350 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
15360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
15370 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
15380 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
15390 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
153a0 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
153b0 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
153c0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
153d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
153e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
153f0 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
15400 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
15410 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
15420 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
15430 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
15440 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
15450 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
15460 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
15470 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
15480 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
15490 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
154a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
154b0 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
154c0 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
154d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
154e0 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
154f0 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
15500 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
15510 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
15520 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
15530 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
15540 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
15550 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
15560 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
15570 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
15580 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
15590 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
155a0 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
155b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
155c0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
155d0 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
155e0 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
155f0 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
15600 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
15610 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
15620 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
15630 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
15640 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
15650 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
15660 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
15670 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
15680 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e   ){.    db->bBen
15690 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20  ignMalloc++;.   
156a0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
156b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
156c0 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30   if( db->pErr==0
156d0 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71   ) db->pErr = sq
156e0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
156f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
15700 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
15710 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
15720 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
15730 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
15740 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  T);.    sqlite3E
15750 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15760 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  ;.    db->bBenig
15770 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c  nMalloc--;.  }el
15780 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20  se if( db->pErr 
15790 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
157a0 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70  lueSetNull(db->p
157b0 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Err);.  }.  db->
157c0 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
157d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
157e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
157f0 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
15800 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
15810 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
15820 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
15830 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
15840 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
15850 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
15860 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
15870 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
15880 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
15890 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
158a0 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
158b0 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
158c0 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
158d0 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
158e0 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
158f0 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
15900 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
15910 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
15920 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
15930 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
15940 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
15950 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
15960 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
15970 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15980 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
15990 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
159a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
159b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
159c0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
159d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
159e0 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
159f0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
15a00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
15a10 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
15a20 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
15a30 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
15a40 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
15a50 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
15a60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
15a70 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
15a80 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
15a90 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
15aa0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
15ab0 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
15ac0 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
15ad0 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
15ae0 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
15af0 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
15b00 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
15b10 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
15b20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
15b30 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
15b40 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
15b50 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
15b60 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
15b70 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
15b80 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
15b90 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
15ba0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
15bb0 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
15bc0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
15bd0 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
15be0 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
15bf0 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
15c00 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
15c10 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
15c20 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
15c30 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
15c40 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
15c50 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
15c60 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
15c70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
15c80 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
15c90 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
15ca0 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
15cb0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
15cc0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
15cd0 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
15ce0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
15cf0 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
15d00 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
15d10 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
15d20 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
15d30 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
15d40 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
15d50 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
15d60 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
15d70 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15d80 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
15d90 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
15da0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
15db0 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49  >=0 ){.    vdbeI
15dc0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a  nvokeSqllog(p);.
15dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
15de0 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b  ransferError(p);
15df0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
15e00 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
15e10 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
15e20 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
15e30 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29  p->runOnlyOnce )
15e40 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
15e50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
15e60 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
15e70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
15e80 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
15e90 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
15ea0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
15eb0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
15ec0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
15ed0 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
15ee0 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
15ef0 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
15f00 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
15f10 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
15f20 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
15f30 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
15f40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
15f50 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c  thMsg(db, p->rc,
15f60 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
15f70 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
15f80 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
15f90 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
15fa0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
15fb0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
15fc0 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
15fd0 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
15fe0 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
15ff0 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
16000 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
16010 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
16020 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
16030 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
16040 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
16050 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
16060 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
16070 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
16080 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
16090 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
160a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
160b0 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
160c0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
160d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
160e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
160f0 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
16100 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
16110 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
16120 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
16130 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
16140 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
16150 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
16160 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
16170 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
16180 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
16190 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
161a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
161b0 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
161c0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
161d0 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
161e0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
161f0 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
16200 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
16210 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
16220 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
16230 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
16240 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
16250 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
16260 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
16270 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
16280 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
16290 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
162a0 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
162b0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
162c0 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
162d0 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
162e0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
162f0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
16300 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
16310 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
16320 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
16330 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
16340 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
16350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16360 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
16370 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
16380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
16390 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
163a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
163b0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
163c0 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65  AGIC_RESET;.  re
163d0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
163e0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
163f0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
16400 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
16410 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
16420 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
16430 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
16440 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
16450 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
16460 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
16470 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
16480 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16490 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
164a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
164b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
164c0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
164d0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
164e0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
164f0 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
16500 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
16510 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
16520 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
16530 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
16540 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16550 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
16560 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16570 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
16580 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
16590 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
165a0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
165b0 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
165c0 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
165d0 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
165e0 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
165f0 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
16600 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
16610 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
16620 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16630 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
16640 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
16650 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
16660 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
16670 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
16680 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
16690 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
166a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
166b0 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
166c0 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
166d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
166e0 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
166f0 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
16700 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
16710 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
16720 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
16730 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
16740 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
16750 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
16760 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
16770 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
16780 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
16790 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
167a0 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
167b0 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
167c0 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
167d0 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  ameter correspon
167e0 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
167f0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
16800 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
16810 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ata(sqlite3 *db,
16820 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69   AuxData **pp, i
16830 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
16840 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20  ){.  while( *pp 
16850 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a  ){.    AuxData *
16860 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20  pAux = *pp;.    
16870 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20  if( (iOp<0).    
16880 20 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f   || (pAux->iAuxO
16890 70 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20  p==iOp.         
168a0 20 26 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72   && pAux->iAuxAr
168b0 67 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  g>=0.          &
168c0 26 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67  & (pAux->iAuxArg
168d0 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
168e0 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
168f0 69 41 75 78 41 72 67 29 29 29 29 0a 20 20 20 20  iAuxArg)))).    
16900 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
16910 65 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67  e( pAux->iAuxArg
16920 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
16930 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41  ( pAux->xDeleteA
16940 75 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  ux ){.        pA
16950 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70  ux->xDeleteAux(p
16960 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
16970 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
16980 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a  pAux->pNextAux;.
16990 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
169a0 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20  ree(db, pAux);. 
169b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169c0 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
169d0 41 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Aux;.    }.  }.}
169e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
169f0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
16a00 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
16a10 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
16a20 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
16a30 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
16a40 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
16a50 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
16a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
16a70 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
16a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
16a90 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16aa0 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
16ab0 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
16ac0 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
16ad0 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
16ae0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
16af0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
16b00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16b10 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
16b20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
16b30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16b40 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
16b50 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
16b60 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
16b70 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
16b80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
16b90 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
16ba0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
16bb0 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
16bc0 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
16bd0 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
16be0 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
16bf0 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
16c00 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
16c10 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
16c20 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
16c30 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
16c40 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
16c50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16c60 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
16c70 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
16c80 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
16c90 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
16ca0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
16cb0 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73   p->nVar);.    s
16cc0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16cd0 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20   p->pVList);.   
16ce0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16cf0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
16d00 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  }.  vdbeFreeOpAr
16d10 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
16d20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
16d30 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16d40 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
16d50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16d60 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20  ->zSql);.#ifdef 
16d70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16d80 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
16d90 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
16da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
16db0 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
16dc0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16dd0 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e  db, p->aScan[i].
16de0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
16df0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16e00 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20  db, p->aScan);. 
16e10 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
16e20 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16e30 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16e40 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16e50 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16e60 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16e70 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16e80 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16e90 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16ea0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16eb0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16ec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16ed0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16ee0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16ef0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
16f00 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16f10 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16f20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16f30 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16f40 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16f50 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16f60 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16f70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16f80 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16f90 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16fa0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16fb0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16fc0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
16fd0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
16fe0 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
16ff0 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
17000 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
17010 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
17020 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
17030 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
17040 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
17050 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
17060 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
17070 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
17080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17090 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
170a0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
170b0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
170c0 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
170d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
170e0 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
170f0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
17100 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
17110 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
17120 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
17130 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
17140 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
17150 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17160 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17170 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17180 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
17190 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  p->uc.pCursor, 0
171a0 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
171b0 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69  t, 0, &res);.  i
171c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
171d0 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  c;.  if( res!=0 
171e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
171f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69  CORRUPT_BKPT;.#i
17200 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
17210 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
17220 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
17230 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
17240 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
17250 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
17260 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
17270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17280 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
17290 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
172a0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
172b0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
172c0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
172d0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
172e0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
172f0 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
17300 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
17310 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
17320 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
17330 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
17340 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
17350 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
17360 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
17370 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
17380 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
17390 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
173a0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
173b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
173c0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
173d0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
173e0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
173f0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
17400 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
17410 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
17420 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
17430 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
17440 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
17450 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
17460 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
17470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
17480 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
17490 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
174a0 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
174b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
174c0 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63  sorRestore(p->uc
174d0 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  .pCursor, &isDif
174e0 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
174f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
17500 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
17510 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
17520 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
17530 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
17540 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
17550 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
17560 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
17570 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
17580 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
17590 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
175a0 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
175b0 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
175c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
175d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
175e0 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
175f0 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  or *p){.  assert
17600 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
17610 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
17620 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
17630 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
17640 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
17650 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
17660 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
17670 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
17680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17690 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
176a0 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
176b0 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
176c0 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
176d0 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
176e0 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
176f0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
17700 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
17710 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
17720 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
17730 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
17740 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
17750 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
17760 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
17770 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
17780 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
17790 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
177a0 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
177b0 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
177c0 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
177d0 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
177e0 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
177f0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
17800 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
17810 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
17820 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
17830 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
17840 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
17850 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
17860 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
17870 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
17880 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
17890 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
178a0 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
178b0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
178c0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
178d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
178e0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
178f0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
17900 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
17910 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c  **pp, int *piCol
17920 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  ){.  VdbeCursor 
17930 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20  *p = *pp;.  if( 
17940 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17950 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20  TYPE_BTREE ){.  
17960 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
17970 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20  dMoveto ){.     
17980 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20   int iMap;.     
17990 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20   if( p->aAltMap 
179a0 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41  && (iMap = p->aA
179b0 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29  ltMap[1+*piCol])
179c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  >0 ){.        *p
179d0 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f  p = p->pAltCurso
179e0 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  r;.        *piCo
179f0 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20  l = iMap - 1;.  
17a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17a10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
17a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e        return han
17a30 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
17a40 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o(p);.    }.    
17a50 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
17a60 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
17a70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
17a80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61  .      return ha
17a90 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
17aa0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
17ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
17ad0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
17ae0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
17af0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
17b00 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17b10 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
17b20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17b30 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
17b40 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
17b50 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
17b60 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
17b70 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
17b80 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
17b90 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
17ba0 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
17bb0 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
17bc0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
17bd0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
17be0 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
17bf0 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
17c00 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
17c10 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
17c20 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
17c30 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
17c40 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
17c50 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
17c60 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
17c70 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
17c80 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
17c90 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
17ca0 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
17cb0 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
17cc0 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
17cd0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
17ce0 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
17cf0 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
17d00 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
17d10 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
17d20 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
17d30 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
17d40 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
17d50 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
17d60 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
17d70 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
17d80 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
17d90 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
17da0 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
17db0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
17dc0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
17dd0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
17de0 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
17df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
17e00 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
17e10 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
17e20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
17e30 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
17e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
17e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
17e60 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17e80 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
17e90 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
17eb0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17ec0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17ed0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
17ee0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
17ef0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17f00 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
17f30 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17f40 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
17f50 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
17f60 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17f70 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17f80 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
17f90 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
17fa0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17fb0 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
17fe0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17ff0 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
18000 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
18010 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
18020 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
18050 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
18060 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
18080 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
18090 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
180a0 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
180d0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
180e0 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
180f0 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
18100 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
18110 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
18120 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
18130 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
18140 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
18150 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
18160 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
18170 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
18180 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
18190 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
181a0 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
181b0 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
181c0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
181d0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
181e0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
181f0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
18200 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
18210 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
18220 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
18230 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
18240 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
18250 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
18260 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
18270 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
18280 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
18290 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
182a0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
182b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
182c0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
182d0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
182e0 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
182f0 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
18300 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
18310 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
18320 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
18330 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
18340 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
18350 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
18360 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
18370 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
18380 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
18390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
183a0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
183b0 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
183c0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
183d0 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
183e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
183f0 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
18400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18410 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
18420 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
18430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18440 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
18450 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
18460 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
18470 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
18480 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
18490 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
184a0 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
184b0 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
184c0 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
184d0 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
184e0 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
184f0 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
18500 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
18510 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
18520 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
18530 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
18540 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
18550 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
18560 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18570 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
18580 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
18590 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
185a0 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
185b0 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
185c0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
185d0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
185e0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
185f0 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
18600 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
18610 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
18620 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
18630 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
18640 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
18650 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
18660 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
18670 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
18680 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
18690 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
186a0 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
186b0 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
186c0 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
186d0 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
186e0 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
186f0 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
18700 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
18710 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
18720 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
18730 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
18740 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
18750 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
18760 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
18770 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
18780 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
18790 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
187a0 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
187b0 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
187c0 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
187d0 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
187e0 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
187f0 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
18800 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
18810 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
18820 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
18830 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
18840 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
18850 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
18860 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
18870 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
18880 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
18890 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
188a0 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
188b0 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
188c0 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
188d0 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
188e0 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
188f0 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
18900 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
18910 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
18920 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
18930 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
18940 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
18950 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
18960 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
18970 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
18980 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
18990 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
189a0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
189b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
189c0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
189d0 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
189e0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
189f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
18a00 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
18a10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
18a20 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
18a30 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
18a40 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
18a50 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18a60 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
18a70 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
18a80 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
18a90 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
18aa0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
18ab0 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
18ac0 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
18ad0 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
18ae0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
18af0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
18b00 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
18b10 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18b20 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
18b30 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
18b40 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
18b50 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
18b60 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
18b70 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
18b80 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
18b90 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
18ba0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
18bb0 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
18bc0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
18bd0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
18be0 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
18bf0 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
18c00 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
18c10 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
18c20 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
18c30 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
18c40 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
18c50 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
18c60 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
18c70 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
18c80 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
18c90 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
18ca0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
18cb0 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
18cc0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
18cd0 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
18ce0 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
18cf0 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
18d00 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
18d10 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
18d20 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
18d30 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
18d40 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
18d50 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
18d60 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
18d70 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
18d80 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
18d90 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
18da0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
18db0 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
18dc0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
18dd0 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
18de0 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
18df0 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
18e00 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
18e10 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
18e20 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
18e30 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
18e40 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
18e50 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
18e60 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
18e70 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
18e80 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
18e90 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
18ea0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18eb0 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
18ec0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18ed0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
18ee0 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
18ef0 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
18f00 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
18f10 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
18f20 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
18f30 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
18f40 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
18f50 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
18f60 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
18f70 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
18f80 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
18f90 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
18fa0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
18fb0 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
18fc0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
18fd0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
18fe0 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
18ff0 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
19000 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
19010 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
19020 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
19030 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
19040 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
19050 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
19060 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
19070 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
19080 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
19090 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
190a0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
190b0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
190c0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
190d0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
190e0 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
190f0 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
19100 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
19110 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
19120 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
19130 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
19140 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
19150 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
19160 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
19170 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
19180 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
19190 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
191a0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
191b0 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
191c0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
191d0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
191e0 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
191f0 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
19200 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
19210 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
19220 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
19230 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
19240 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
19250 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
19260 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
19270 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
19280 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
19290 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
192a0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
192b0 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
192c0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
192d0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
192e0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
192f0 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
19300 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
19310 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
19320 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
19330 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
19340 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
19350 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
19360 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
19370 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
19380 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19390 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
193a0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
193b0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
193c0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
193d0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
193e0 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
193f0 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
19400 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
19410 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
19420 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
19430 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
19440 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
19450 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
19460 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
19470 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
19480 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
19490 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
194a0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
194b0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
194c0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
194d0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
194e0 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
194f0 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
19500 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
19510 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
19520 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
19530 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
19540 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
19550 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
19560 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
19570 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
19580 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
19590 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
195a0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
195b0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
195c0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
195d0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
195e0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
195f0 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
19600 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19610 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
19620 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
19630 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
19640 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
19650 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
19660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
19670 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
19680 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
19690 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
196a0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
196b0 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
196c0 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
196d0 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
196e0 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
196f0 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
19700 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
19710 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
19720 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
19730 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
19740 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
19750 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19760 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
19770 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
19780 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
19790 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
197a0 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
197b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
197c0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
197d0 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
197e0 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
197f0 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
19800 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
19810 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
19820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
19830 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
19840 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
19850 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
19860 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
19870 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
19880 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
19890 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
198a0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
198b0 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
198c0 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
198d0 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
198e0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
198f0 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
19900 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
19910 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
19920 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
19930 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
19940 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
19950 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
19960 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
19970 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
19980 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
19990 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
199a0 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
199b0 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
199c0 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
199d0 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
199e0 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
199f0 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
19a00 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
19a10 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
19a20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
19a30 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
19a40 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
19a50 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
19a60 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
19a70 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
19a80 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
19a90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19aa0 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
19ab0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19ac0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
19ad0 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
19ae0 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
19af0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
19b00 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
19b10 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
19b20 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
19b30 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
19b40 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
19b50 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
19b60 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
19b70 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
19b80 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
19b90 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
19ba0 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
19bb0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
19bc0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
19bd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
19be0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
19bf0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19c00 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
19c10 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
19c20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
19c30 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
19c40 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
19c50 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
19c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
19c70 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
19c80 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
19c90 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
19ca0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
19cb0 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
19cc0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
19cd0 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
19ce0 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
19cf0 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
19d00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19d10 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
19d20 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19d30 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
19d40 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
19d50 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
19d60 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
19d70 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
19d80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19d90 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
19da0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19db0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19dc0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19dd0 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
19de0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19df0 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
19e00 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
19e10 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
19e20 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
19e30 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
19e40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19e50 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
19e60 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
19e70 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
19e80 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
19e90 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
19ea0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
19eb0 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
19ec0 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
19ed0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
19ee0 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
19ef0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
19f00 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
19f10 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
19f20 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
19f30 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
19f40 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
19f50 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
19f60 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
19f70 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
19f80 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
19f90 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
19fa0 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
19fb0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19fc0 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
19fd0 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
19fe0 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
19ff0 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1a000 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1a010 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1a020 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1a030 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1a040 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1a050 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1a060 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1a070 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1a080 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1a090 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a0a0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1a0b0 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1a0c0 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1a0d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1a0e0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1a0f0 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1a100 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a110 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1a120 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1a130 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1a140 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1a150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a160 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1a170 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1a180 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a1a0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1a1b0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1a1c0 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1a1d0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1a1e0 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
1a1f0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
1a200 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
1a210 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
1a220 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
1a230 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
1a240 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20  e 0: {  /* Null 
1a250 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a260 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38  ENCE-OF: R-24078
1a270 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20  -09375 Value is 
1a280 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20  a NULL. */.     
1a290 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1a2a0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
1a2b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a2c0 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20  case 1: {.      
1a2d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a2e0 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61  R-44885-25196 Va
1a2f0 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20  lue is an 8-bit 
1a300 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a  twos-complement.
1a310 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
1a320 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a330 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f  >u.i = ONE_BYTE_
1a340 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a350 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a360 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a370 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a380 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a390 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1a3a0 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
1a3b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a3c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a3d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
1a3e0 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20  794-35026 Value 
1a3f0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a400 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  16-bit.      ** 
1a410 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a420 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a430 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57    pMem->u.i = TW
1a440 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1a450 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a460 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1a480 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1a490 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
1a4a0 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
1a4b0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
1a4c0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1a4d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a4e0 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31  F: R-37839-54301
1a4f0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a500 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20  endian 24-bit.  
1a510 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1a520 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1a530 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a540 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
1a550 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a560 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a570 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a580 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a590 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a5a0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
1a5b0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
1a5c0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a5d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a5e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
1a5f0 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20  849-26079 Value 
1a600 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a610 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  32-bit.      ** 
1a620 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a630 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a640 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
1a650 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  UR_BYTE_INT(buf)
1a660 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63  ;.#ifdef __HP_cc
1a670 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20   .      /* Work 
1a680 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78  around a sign-ex
1a690 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74  tension bug in t
1a6a0 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66  he HP compiler f
1a6b0 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20  or HP/UX */.    
1a6c0 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38    if( buf[0]&0x8
1a6d0 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d  0 ) pMem->u.i |=
1a6e0 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30   0xffffffff80000
1a6f0 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  000LL;.#endif.  
1a700 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a710 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a720 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a730 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a740 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
1a750 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1a760 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1a770 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1a780 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a790 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61  R-50385-09674 Va
1a7a0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a7b0 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20  ian 48-bit.     
1a7c0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1a7d0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1a7e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a7f0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1a800 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
1a810 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1a820 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a830 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a840 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a850 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a860 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a870 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
1a880 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
1a890 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a8a0 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
1a8b0 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
1a8c0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
1a8d0 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
1a8e0 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
1a8f0 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
1a900 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
1a910 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
1a920 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
1a930 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
1a940 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
1a950 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
1a960 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
1a970 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
1a980 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
1a990 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
1a9a0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
1a9b0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
1a9c0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
1a9d0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a9e0 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32  E-OF: R-12976-22
1a9f0 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65  893 Value is the
1aa00 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20   integer 0. */. 
1aa10 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1aa20 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31  -OF: R-18143-121
1aa30 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  21 Value is the 
1aa40 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20  integer 1. */.  
1aa50 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1aa60 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
1aa70 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1aa80 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1aa90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1aaa0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
1aab0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1aac0 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33  CE-OF: R-14606-3
1aad0 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20  1564 Value is a 
1aae0 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d  BLOB that is (N-
1aaf0 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20  12)/2 bytes in. 
1ab00 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a       ** length..
1ab10 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
1ab20 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30  E-OF: R-28401-00
1ab30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73  140 Value is a s
1ab40 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78  tring in the tex
1ab50 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20  t encoding and. 
1ab60 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32       ** (N-13)/2
1ab70 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
1ab80 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  . */.      stati
1ab90 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
1aba0 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
1abb0 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
1abc0 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
1abd0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
1abe0 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
1abf0 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
1ac00 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1ac10 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1ac20 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
1ac30 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
1ac40 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
1ac50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ac60 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
1ac70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ac80 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
1ac90 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
1aca0 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
1acb0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
1acc0 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
1acd0 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
1ace0 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
1acf0 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
1ad00 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
1ad10 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1ad20 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
1ad30 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
1ad40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
1ad50 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
1ad60 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
1ad70 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
1ad80 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
1ad90 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
1ada0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
1adb0 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
1adc0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
1add0 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
1ade0 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
1adf0 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
1ae00 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
1ae10 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
1ae20 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
1ae30 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
1ae40 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
1ae50 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
1ae60 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
1ae70 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
1ae80 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
1ae90 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
1aea0 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
1aeb0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1aec0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1aed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
1aee0 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
1aef0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1af00 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
1af10 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
1af20 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
1af30 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
1af40 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20  pKeyInfo        
1af50 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
1af60 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
1af70 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61  ord */.){.  Unpa
1af80 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
1af90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1afa0 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
1afb0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
1afc0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1afe0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1aff0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1b000 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   */.  nByte = RO
1b010 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1b020 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
1b030 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
1b040 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
1b050 0a 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64  .  p = (Unpacked
1b060 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33  Record *)sqlite3
1b070 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
1b080 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
1b090 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1b0a0 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d  urn 0;.  p->aMem
1b0b0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
1b0c0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
1b0d0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1b0e0 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
1b0f0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1b100 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
1b110 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1b120 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
1b130 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
1b140 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1b150 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1b160 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1b170 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1b180 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1b190 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1b1a0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1b1b0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1b1c0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1b1d0 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1b1e0 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1b1f0 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1b200 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1b210 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1b220 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1b230 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1b240 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1b250 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1b260 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1b270 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1b280 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b290 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1b2a0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1b2b0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1b2c0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1b2d0 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1b2e0 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1b2f0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1b300 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1b310 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1b320 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1b330 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1b340 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1b350 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1b360 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
1b370 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1b380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b390 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1b3a0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1b3b0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3d0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b3e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1b3f0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1b400 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1b410 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1b420 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1b430 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1b440 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1b450 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1b460 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1b470 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1b480 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1b490 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1b4a0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1b4b0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1b4c0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1b4d0 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1b4e0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1b4f0 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1b500 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1b510 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1b520 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1b530 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1b540 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1b550 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1b560 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1b570 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1b580 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1b590 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
1b5a0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1b5b0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1b5c0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1b5d0 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1b5e0 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1b5f0 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1b600 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
1b610 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1b620 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
1b630 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1b640 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1b650 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1b660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1b670 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1b680 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1b690 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1b6a0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1b6b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b6c0 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1b6d0 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1b6e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1b6f0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1b700 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1b710 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1b720 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1b730 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b740 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1b750 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1b760 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1b770 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1b780 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1b790 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1b7a0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1b7b0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1b7c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1b7d0 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1b7e0 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1b7f0 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1b800 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b810 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1b820 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1b830 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1b840 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1b850 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1b860 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1b870 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1b880 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1b890 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1b8a0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1b8b0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1b8c0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1b8d0 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1b8e0 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1b8f0 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1b900 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1b910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1b920 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1b930 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1b940 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b950 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1b960 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1b970 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1b980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b990 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b9a0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1b9b0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1b9c0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1b9d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1b9e0 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1b9f0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1ba00 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1ba10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ba20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1ba30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1ba40 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1ba50 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1ba60 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1ba70 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1ba80 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1ba90 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1baa0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1bab0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1bac0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1bad0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1bae0 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1baf0 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1bb00 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1bb10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bb20 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1bb30 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1bb40 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1bb50 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1bb60 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1bb70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1bb80 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1bb90 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1bba0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1bbb0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1bbc0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1bbd0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1bbe0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1bbf0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1bc00 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1bc10 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1bc20 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1bc30 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1bc40 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1bc50 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1bc60 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1bc70 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1bc80 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1bc90 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1bca0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1bcb0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1bcc0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1bcd0 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1bce0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1bcf0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1bd00 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1bd10 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1bd20 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1bd30 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1bd40 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1bd50 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1bd60 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1bd70 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1bd80 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1bd90 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1bda0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1bdb0 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1bdc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1bdd0 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1bde0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1bdf0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1be00 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1be10 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1be20 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1be30 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1be40 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1be50 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1be60 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1be70 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1be80 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1be90 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1bea0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1beb0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
1bec0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
1bed0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
1bee0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
1bef0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
1bf00 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
1bf10 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
1bf20 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
1bf30 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
1bf40 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
1bf50 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
1bf60 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
1bf70 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
1bf80 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
1bf90 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
1bfa0 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
1bfb0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
1bfc0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
1bfd0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1bfe0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
1bff0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
1c000 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
1c010 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
1c020 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
1c030 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
1c040 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
1c050 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1c060 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
1c070 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
1c080 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c090 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1c0a0 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
1c0b0 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
1c0c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1c0d0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1c0e0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
1c0f0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1c100 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1c110 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1c120 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1c130 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1c140 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c150 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1c160 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1c170 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1c180 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1c190 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1c1a0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1c1b0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1c1c0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
1c1d0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
1c1e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1c1f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c200 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1c210 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1c220 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1c230 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1c240 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1c250 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c260 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1c270 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1c280 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1c290 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1c2a0 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1c2b0 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1c2c0 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1c2d0 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1c2e0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1c2f0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1c300 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1c310 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1c320 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1c330 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1c340 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1c350 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1c360 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1c370 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1c380 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1c390 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1c3a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1c3b0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1c3c0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1c3d0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1c3e0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1c3f0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1c400 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1c410 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1c420 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1c430 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1c440 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1c450 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1c460 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1c470 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1c480 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1c490 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1c4a0 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1c4b0 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1c4c0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1c4d0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c4e0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1c4f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c500 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1c510 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1c520 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1c530 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1c540 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1c550 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c560 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1c570 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c580 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1c590 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1c5a0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1c5b0 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1c5c0 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1c5d0 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1c5e0 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1c5f0 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1c600 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1c610 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1c620 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1c630 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1c640 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b  nfo->nField + pK
1c650 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e  eyInfo->nXField.
1c660 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1c670 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1c680 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1c690 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1c6a0 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1c6b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1c6c0 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1c6d0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1c6e0 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1c6f0 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1c700 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1c710 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1c720 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1c730 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1c740 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  e KeyInfo.nField
1c750 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   or KeyInfo.nXFi
1c760 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1c770 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1c780 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1c790 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1c7a0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c7b0 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1c7c0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1c7d0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1c7e0 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1c7f0 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1c800 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1c810 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1c820 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1c830 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1c840 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1c850 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1c860 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1c870 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1c880 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1c890 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1c8a0 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1c8b0 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1c8c0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1c8d0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1c8e0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1c8f0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1c900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1c910 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1c920 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1c930 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1c940 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1c950 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1c960 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1c970 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1c980 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1c990 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1c9a0 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d  fo->nXField );.}
1c9b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c9c0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c9d0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c9e0 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1c9f0 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1ca00 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1ca10 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1ca20 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1ca30 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1ca40 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1ca50 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1ca60 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1ca70 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1ca80 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1ca90 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1caa0 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1cab0 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1cac0 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1cad0 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1cae0 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1caf0 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1cb00 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1cb10 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1cb20 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1cb30 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1cb40 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1cb50 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1cb60 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1cb70 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1cb80 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cba0 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1cbb0 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1cbc0 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1cbd0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1cbe0 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1cbf0 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1cc00 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1cc10 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1cc20 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1cc30 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1cc40 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1cc50 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1cc60 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1cc70 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1cc80 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1cc90 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1cca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1ccb0 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1ccc0 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1ccd0 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1cce0 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1ccf0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1cd00 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1cd10 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1cd20 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1cd30 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1cd40 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1cd50 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1cd60 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1cd70 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1cd80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1cd90 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1cda0 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1cdb0 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1cdc0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1cdd0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1cde0 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1cdf0 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1ce00 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1ce10 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1ce20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1ce30 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1ce40 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  v2==0) ){.      
1ce50 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70 72  if( prcErr ) *pr
1ce60 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1ce70 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1ce80 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
1ce90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43  e{.      rc = pC
1cea0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1ceb0 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31  >pUser, c1.n, v1
1cec0 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20  , c2.n, v2);.   
1ced0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1cee0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
1cef0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cf00 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
1cf10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1cf20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1cf30 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69  he input pBlob i
1cf40 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1cf50 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69  be a Blob that i
1cf60 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20  s not marked.** 
1cf70 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20  with MEM_Zero.  
1cf80 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
1cf90 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72  t could be a zer
1cfa0 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69  o-blob..*/.stati
1cfb0 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28  c int isAllZero(
1cfc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1cfd0 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt n){.  int i;.
1cfe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
1cff0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
1d000 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
1d010 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1d020 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1d030 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75  two blobs.  Retu
1d040 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1d050 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1d060 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  f the first.** i
1d070 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1d080 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1d090 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1d0a0 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  d, respectively.
1d0b0 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20  .** If one blob 
1d0c0 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
1d0d0 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74  he other, then t
1d0e0 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68  he shorter is th
1d0f0 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61  e lessor..*/.sta
1d100 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
1d110 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42  INE int sqlite3B
1d120 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  lobCompare(const
1d130 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74   Mem *pB1, const
1d140 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e   Mem *pB2){.  in
1d150 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20  t c;.  int n1 = 
1d160 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32  pB1->n;.  int n2
1d170 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a   = pB2->n;..  /*
1d180 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
1d190 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76  to have a Blob v
1d1a0 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f  alue that has so
1d1b0 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74  me non-zero cont
1d1c0 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65  ent.  ** followe
1d1d0 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e  d by zero conten
1d1e0 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c  t.  But that onl
1d1f0 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42  y comes up for B
1d200 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a  lobs formed.  **
1d210 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1d220 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e  ecord opcode, an
1d230 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76  d such Blobs nev
1d240 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e  er get passed in
1d250 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d  to.  ** sqlite3M
1d260 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a  emCompare(). */.
1d270 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e    assert( (pB1->
1d280 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1d290 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b  )==0 || n1==0 );
1d2a0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d  .  assert( (pB2-
1d2b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d2c0 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29  o)==0 || n2==0 )
1d2d0 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66  ;..  if( (pB1->f
1d2e0 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29  lags|pB2->flags)
1d2f0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1d300 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67     if( pB1->flag
1d310 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26  s & pB2->flags &
1d320 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1d330 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75     return pB1->u
1d340 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e  .nZero - pB2->u.
1d350 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65  nZero;.    }else
1d360 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20   if( pB1->flags 
1d370 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d380 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1d390 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e  ro(pB2->z, pB2->
1d3a0 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  n) ) return -1;.
1d3b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1d3c0 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a  ->u.nZero - n2;.
1d3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d3e0 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1d3f0 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20  pB1->z, pB1->n) 
1d400 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1d410 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70     return n1 - p
1d420 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1d430 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d   }.  }.  c = mem
1d440 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d  cmp(pB1->z, pB2-
1d450 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a  >z, n1>n2 ? n2 :
1d460 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20   n1);.  if( c ) 
1d470 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75  return c;.  retu
1d480 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f  rn n1 - n2;.}../
1d490 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72  *.** Do a compar
1d4a0 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36  ison between a 6
1d4b0 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
1d4c0 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69  eger and a 64-bi
1d4d0 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  t floating-point
1d4e0 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  .** number.  Ret
1d4f0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1d500 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1d510 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36  if the first (i6
1d520 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  4) is less than,
1d530 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  .** equal to, or
1d540 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1d550 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65  e second (double
1d560 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1d570 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1d580 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64  Compare(i64 i, d
1d590 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20  ouble r){.  if( 
1d5a0 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
1d5b0 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20  E_TYPE)>8 ){.   
1d5c0 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45   LONGDOUBLE_TYPE
1d5d0 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45   x = (LONGDOUBLE
1d5e0 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28  _TYPE)i;.    if(
1d5f0 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   x<r ) return -1
1d600 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20  ;.    if( x>r ) 
1d610 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1d620 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1d630 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20  {.    i64 y;.   
1d640 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69   double s;.    i
1d650 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36  f( r<-9223372036
1d660 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65  854775808.0 ) re
1d670 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28  turn +1;.    if(
1d680 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34   r>9223372036854
1d690 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72  775807.0 ) retur
1d6a0 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69  n -1;.    y = (i
1d6b0 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c  64)r;.    if( i<
1d6c0 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  y ) return -1;. 
1d6d0 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20     if( i>y ){.  
1d6e0 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c      if( y==SMALL
1d6f0 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30  EST_INT64 && r>0
1d700 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1d710 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b        return +1;
1d720 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28  .    }.    s = (
1d730 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66  double)i;.    if
1d740 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( s<r ) return -
1d750 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29  1;.    if( s>r )
1d760 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d770 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
1d780 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1d790 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
1d7a0 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
1d7b0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
1d7c0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
1d7d0 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
1d7e0 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
1d7f0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1d800 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1d810 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
1d820 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
1d830 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
1d840 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
1d850 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
1d860 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
1d870 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
1d880 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
1d890 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
1d8a0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1d8b0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
1d8c0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
1d8d0 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
1d8e0 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
1d8f0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
1d900 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
1d910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1d920 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1d930 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
1d940 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
1d950 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
1d960 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1d970 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32  l){.  int f1, f2
1d980 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64  ;.  int combined
1d990 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20  _flags;..  f1 = 
1d9a0 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem1->flags;.  
1d9b0 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67  f2 = pMem2->flag
1d9c0 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  s;.  combined_fl
1d9d0 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61  ags = f1|f2;.  a
1d9e0 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64  ssert( (combined
1d9f0 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  _flags & MEM_Row
1da00 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f  Set)==0 );. .  /
1da10 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1da20 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65  s NULL, it is le
1da30 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  ss than the othe
1da40 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  r. If both value
1da50 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c  s.  ** are NULL,
1da60 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
1da70 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1da80 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
1da90 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26  .    return (f2&
1daa0 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26  MEM_Null) - (f1&
1dab0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a  MEM_Null);.  }..
1dac0 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e    /* At least on
1dad0 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c  e of the two val
1dae0 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a  ues is a number.
1daf0 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1db00 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
1db10 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
1db20 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1db30 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1db40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1db50 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1db60 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1db70 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1db80 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1db90 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .i ) return +1;.
1dba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1dbb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1dbc0 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61  1 & f2 & MEM_Rea
1dbd0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1dbe0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20  f( pMem1->u.r < 
1dbf0 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1dc00 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1dc10 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70  ( pMem1->u.r > p
1dc20 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1dc30 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1dc40 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1dc50 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1dc60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1dc70 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
1dc80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1dc90 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46  turn sqlite3IntF
1dca0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1dcb0 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75  1->u.i, pMem2->u
1dcc0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1dcd0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1dce0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1dcf0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1dd00 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1dd10 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1dd20 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1dd30 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69      return -sqli
1dd40 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1dd50 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70  re(pMem2->u.i, p
1dd60 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem1->u.r);.    
1dd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dd80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1dd90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1dda0 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20  turn +1;.  }..  
1ddb0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1ddc0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1ddd0 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1dde0 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1ddf0 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1de00 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1de10 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1de20 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1de30 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1de40 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1de50 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1de60 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1de70 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1de80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1de90 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1dea0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1deb0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1dec0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1ded0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1dee0 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65  Mem2->enc || pMe
1def0 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  m1->db->mallocFa
1df00 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
1df10 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1df20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a  SQLITE_UTF8 || .
1df30 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
1df40 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1df50 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d  TF16LE || pMem1-
1df60 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1df70 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  16BE );..    /* 
1df80 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
1df90 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64  quence must be d
1dfa0 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70  efined at this p
1dfb0 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20  oint, even if.  
1dfc0 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65    ** the user de
1dfd0 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  letes the collat
1dfe0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74  ion sequence aft
1dff0 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  er the vdbe prog
1e000 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ram is.    ** co
1e010 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73  mpiled (this was
1e020 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20   not always the 
1e030 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  case)..    */.  
1e040 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c    assert( !pColl
1e050 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   || pColl->xCmp 
1e060 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  );..    if( pCol
1e070 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
1e080 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  n vdbeCompareMem
1e090 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d  String(pMem1, pM
1e0a0 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a  em2, pColl, 0);.
1e0b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
1e0c0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77  a NULL pointer w
1e0d0 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  as passed as the
1e0e0 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f   collate functio
1e0f0 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  n, fall through.
1e100 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c      ** to the bl
1e110 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20  ob case and use 
1e120 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1e130 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61  }. .  /* Both va
1e140 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f  lues must be blo
1e150 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69  bs.  Compare usi
1e160 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  ng memcmp().  */
1e170 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1e180 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65  3BlobCompare(pMe
1e190 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a  m1, pMem2);.}...
1e1a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
1e1b0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1e1c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1e1d0 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
1e1e0 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
1e1f0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
1e200 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
1e210 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
1e220 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
1e230 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
1e240 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
1e250 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1e260 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
1e270 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
1e280 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
1e290 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
1e2a0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1e2b0 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
1e2c0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
1e2d0 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
1e2e0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1e2f0 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
1e300 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
1e310 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
1e320 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1e330 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
1e340 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
1e350 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
1e360 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
1e370 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1e380 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
1e390 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
1e3a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e3b0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e3c0 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
1e3d0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e3e0 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
1e3f0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e400 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e410 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
1e420 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1e430 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
1e440 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e450 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1e460 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
1e470 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1e480 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
1e490 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e4a0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
1e4b0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1e4c0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
1e4d0 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
1e4e0 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
1e4f0 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
1e500 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e510 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e520 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
1e530 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
1e540 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1e550 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1e560 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1e570 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
1e580 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1e590 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1e5a0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e5b0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e5c0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1e5d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e5e0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
1e5f0 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
1e600 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
1e610 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
1e620 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
1e630 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e640 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
1e650 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
1e660 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
1e670 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
1e680 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
1e690 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
1e6a0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
1e6b0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1e6c0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
1e6d0 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
1e6e0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1e6f0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1e700 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
1e710 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
1e720 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
1e730 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
1e740 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1e750 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
1e760 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
1e770 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
1e780 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
1e790 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
1e7a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
1e7b0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
1e7c0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
1e7d0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
1e7e0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1e7f0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1e800 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
1e810 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1e820 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1e830 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1e840 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
1e850 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
1e860 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
1e870 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
1e880 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
1e890 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
1e8a0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
1e8b0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
1e8c0 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
1e8d0 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
1e8e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1e8f0 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
1e900 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
1e910 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
1e920 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a  ->errCode to .**
1e930 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1e940 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66  and return 0. If
1e950 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
1e960 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a   encountered, .*
1e970 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  * pPKey2->errCod
1e980 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
1e990 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66  TE_NOMEM and, if
1e9a0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
1e9b0 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66   the.** malloc-f
1e9c0 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f  ailed flag set o
1e9d0 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
1e9e0 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  e (pPKey2->pKeyI
1e9f0 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74  nfo->db)..*/.int
1ea00 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ea10 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1ea20 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  p(.  int nKey1, 
1ea30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1ea40 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1ea50 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1ea60 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20  cord *pPKey2,   
1ea70 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1ea80 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
1ea90 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1eaa0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1eab0 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72  ue, skip the fir
1eac0 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  st field */.){. 
1ead0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1eb00 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1eb10 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1eb20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
1eb50 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61  t field to compa
1eb60 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  re */.  u32 szHd
1eb70 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1eb80 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1eb90 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  of record header
1eba0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1ebb0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ebd0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1ebe0 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72  t type in header
1ebf0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   */.  int rc = 0
1ec00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1ec20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  value */.  Mem *
1ec30 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61  pRhs = pPKey2->a
1ec40 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  Mem;       /* Ne
1ec50 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  xt field of pPKe
1ec60 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  y2 to compare */
1ec70 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1ec80 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1ec90 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74  KeyInfo;.  const
1eca0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ecb0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1ecc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1ecd0 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Key1;.  Mem mem1
1ece0 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70  ;..  /* If bSkip
1ecf0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
1ed00 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1ed10 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64  ready determined
1ed20 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a   that the first.
1ed30 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
1ed40 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72  s in the keys ar
1ed50 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65  e equal. Fix the
1ed60 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76   various stack v
1ed70 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a  ariables so.  **
1ed80 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
1ed90 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72  ne begins compar
1eda0 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e  ing at the secon
1edb0 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66  d field. */.  if
1edc0 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75  ( bSkip ){.    u
1edd0 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20  32 s1;.    idx1 
1ede0 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33  = 1 + getVarint3
1edf0 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29  2(&aKey1[1], s1)
1ee00 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61  ;.    szHdr1 = a
1ee10 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20  Key1[0];.    d1 
1ee20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74  = szHdr1 + sqlit
1ee30 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1ee40 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d  Len(s1);.    i =
1ee50 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a   1;.    pRhs++;.
1ee60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
1ee70 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1ee80 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1ee90 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b      d1 = szHdr1;
1eea0 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73  .    if( d1>(uns
1eeb0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a  igned)nKey1 ){ .
1eec0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1eed0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1eee0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1eef0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1ef00 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1ef10 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  */.    }.    i =
1ef20 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   0;.  }..  VVA_O
1ef30 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1ef40 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1ef50 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1ef60 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1ef70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
1ef80 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1ef90 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b  Field+pPKey2->pK
1efa0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
1efb0 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1efc0 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1efd0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1efe0 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1eff0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1f000 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f010 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1f020 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1f030 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1f040 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1f050 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1f060 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
1f070 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1f080 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1f090 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
1f0a0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
1f0b0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1f0c0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1f0d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f0e0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f0f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f100 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
1f110 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f120 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f130 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1f140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f150 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1f160 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f170 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =7 ){.        sq
1f180 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1f190 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1f1a0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1f1b0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  1);.        rc =
1f1c0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1f1d0 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75  tCompare(pRhs->u
1f1e0 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20  .i, mem1.u.r);. 
1f1f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f200 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
1f210 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1f220 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
1f230 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
1f240 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
1f250 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1f260 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1f270 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1f280 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1f290 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1f2a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1f2b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1f2c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f2d0 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
1f2e0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1f2f0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1f300 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
1f310 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1f320 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1f330 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1f340 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =10 ){.        /
1f350 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31  * Serial types 1
1f360 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65  2 or greater are
1f370 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f   strings and blo
1f380 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e  bs (greater than
1f390 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1f3a0 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61  ers). Types 10 a
1f3b0 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e  nd 11 are curren
1f3c0 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f  tly "reserved fo
1f3d0 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20  r future .      
1f3e0 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74    ** use", so it
1f3f0 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20   doesn't really 
1f400 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20  matter what the 
1f410 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
1f420 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
1f430 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63  them to numberic
1f440 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f   values are.  */
1f450 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1f460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f470 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1f480 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f490 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1f4a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f4b0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1f4c0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1f4d0 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1f4e0 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
1f4f0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1f500 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1f510 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r<pRhs->u.r )
1f520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f530 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
1f540 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
1f550 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r>pRhs->u.r ){
1f560 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f570 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = +1;.          
1f580 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1f590 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f5a0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1f5b0 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c  ompare(mem1.u.i,
1f5c0 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20   pRhs->u.r);.   
1f5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f5e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1f5f0 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
1f600 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1f610 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
1f620 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
1f630 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1f640 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1f650 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1f660 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1f670 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1f680 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1f690 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f6a0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1f6b0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
1f6c0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1f6d0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f6e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f6f0 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
1f700 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1f710 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1f720 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1f730 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1f740 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1f750 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1f760 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
1f770 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f780 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
1f790 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1f7a0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1f7b0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1f7c0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1f7d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f800 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1f810 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f820 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
1f830 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
1f840 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1f850 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1f860 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
1f870 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1f880 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
1f890 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
1f8a0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
1f8b0 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
1f8c0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
1f8d0 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
1f8e0 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
1f8f0 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
1f900 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
1f910 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
1f920 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
1f930 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
1f940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1f950 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1f960 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1f970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1f980 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1f990 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1f9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f9b0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1f9c0 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1f9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f9e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1f9f0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1fa00 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1fa10 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1fa20 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73  Blob ){.      as
1fa30 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61  sert( (pRhs->fla
1fa40 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
1fa50 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20  0 || pRhs->n==0 
1fa60 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  );.      getVari
1fa70 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1fa80 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1fa90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1faa0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1fab0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1fac0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
1fad0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1fae0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
1faf0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1fb00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1fb10 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
1fb20 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1fb30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1fb40 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
1fb50 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1fb60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1fb70 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
1fb80 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1fb90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1fba0 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
1fbb0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1fbc0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1fbd0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1fbe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1fbf0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1fc00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1fc10 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1fc20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1fc30 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1fc40 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1fc50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1fc60 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e   !isAllZero((con
1fc70 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  st char*)&aKey1[
1fc80 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20  d1],nStr) ){.   
1fc90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
1fca0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1fcb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1fcc0 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
1fcd0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20  u.nZero;.       
1fce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1fcf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1fd00 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
1fd10 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
1fd20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1fd30 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1fd40 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1fd50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1fd60 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
1fd70 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
1fd80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1fd90 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1fda0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
1fdb0 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
1fdc0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1fdd0 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
1fde0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
1fdf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1fe00 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
1fe10 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1fe20 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1fe30 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
1fe40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1fe50 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
1fe60 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1fe70 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1fe80 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
1fe90 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1fea0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1feb0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1fec0 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
1fed0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1fee0 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b   i++;.    pRhs++
1fef0 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
1ff00 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1ff10 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1ff20 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
1ff30 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
1ff40 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ff50 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
1ff60 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
1ff70 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1ff80 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  d && d1<=(unsign
1ff90 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
1ffa0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1ffb0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1ffc0 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1ffd0 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1ffe0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1fff0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
20000 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
20010 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
20020 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
20030 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
20040 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
20050 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
20060 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
20070 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
20080 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
20090 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
200a0 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
200b0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
200c0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
200d0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
200e0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
200f0 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
20100 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
20110 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
20120 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
20130 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
20140 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
20150 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20160 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20170 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
20180 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
20190 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62   || pKeyInfo->db
201a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
201b0 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71   );.  pPKey2->eq
201c0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75  Seen = 1;.  retu
201d0 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
201e0 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
201f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20200 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
20210 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
20220 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
20230 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
20240 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
20250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
20260 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
20270 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20280 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
20290 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
202a0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
202b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
202c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
202d0 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
202e0 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
202f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
20300 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
20310 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
20320 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
20330 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
20340 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
20350 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
20360 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
20370 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
20380 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
20390 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
203a0 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
203b0 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
203c0 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
203d0 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
203e0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
203f0 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
20400 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
20410 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
20420 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
20430 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
20440 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
20450 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
20460 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
20470 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
20480 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
20490 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
204a0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
204b0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
204c0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
204d0 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
204e0 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
204f0 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
20500 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
20510 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
20520 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
20530 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
20540 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
20550 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  4 v;.  i64 lhs;.
20560 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
20570 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
20580 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
20590 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
205a0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
205b0 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
205c0 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
205d0 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
205e0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
205f0 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
20600 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20610 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20620 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
20630 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20640 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20660 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
20670 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
20680 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20690 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
206a0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
206b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
206c0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
206d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
206e0 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
206f0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
20700 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
20710 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
20720 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
20730 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
20740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20750 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
20760 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
20770 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
20780 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
20790 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
207a0 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
207b0 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
207c0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
207d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
207e0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
207f0 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
20800 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20810 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
20820 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
20830 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
20840 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
20850 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
20860 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
20870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20880 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
20890 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
208a0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
208b0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
208c0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
208d0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
208e0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
208f0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
20900 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
20910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20920 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20930 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20940 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
20950 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
20960 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
20970 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
20980 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
20990 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
209a0 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
209b0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
209c0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
209d0 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
209e0 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
209f0 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
20a00 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
20a10 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
20a20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
20a30 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
20a40 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
20a50 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
20a60 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
20a70 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
20a80 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
20a90 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
20aa0 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
20ab0 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
20ac0 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
20ad0 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
20ae0 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
20af0 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
20b00 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
20b10 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
20b20 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
20b30 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
20b40 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
20b50 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
20b60 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20b70 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
20b80 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
20b90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20ba0 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
20bb0 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
20bc0 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32   }..  v = pPKey2
20bd0 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
20be0 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
20bf0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20c00 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
20c10 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
20c20 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
20c30 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
20c40 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
20c50 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
20c60 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
20c70 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
20c80 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
20c90 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
20ca0 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
20cb0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
20cc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20cd0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
20ce0 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
20cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
20d00 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
20d10 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
20d20 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
20d30 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
20d40 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
20d50 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
20d60 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
20d70 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
20d80 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20d90 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
20da0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
20db0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  = 1;.  }..  asse
20dc0 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
20dd0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
20de0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
20df0 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
20e00 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
20e10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20e20 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
20e30 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
20e40 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20e50 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
20e60 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20e70 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
20e80 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
20e90 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20ea0 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
20eb0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
20ec0 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
20ed0 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
20ee0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
20ef0 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
20f00 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
20f10 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
20f20 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
20f30 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
20f40 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
20f50 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
20f60 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
20f70 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
20f80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20f90 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
20fa0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
20fb0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
20fc0 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
20fd0 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
20fe0 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
20ff0 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
21000 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  PKey2->aMem[0].f
21010 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
21020 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ;.  vdbeAssertFi
21030 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
21040 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
21050 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
21060 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
21070 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
21080 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
21090 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
210a0 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
210b0 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
210c0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
210d0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
210e0 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
210f0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
21100 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
21110 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21120 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
21130 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
21140 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
21150 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
21160 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
21170 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
21180 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
21190 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
211a0 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
211b0 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
211c0 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
211d0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
211e0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
211f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21200 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21210 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
21220 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
21230 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
21240 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
21250 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
21260 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
21270 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
21280 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
21290 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
212a0 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
212b0 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
212c0 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
212d0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
212e0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
212f0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
21300 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
21310 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21320 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
21330 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
21340 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
21350 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
21360 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
21370 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20  lt_rc;.         
21380 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
21390 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
213a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
213b0 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
213c0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
213d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
213e0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
213f0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d  ey2->r1;.      }
21400 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
21410 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65  es>0 ){.      re
21420 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
21430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21440 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21450 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
21460 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
21470 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
21480 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21490 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20  ey2, res).      
214a0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
214b0 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d        || pPKey2-
214c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d  >pKeyInfo->db->m
214d0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
214e0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
214f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
21500 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
21510 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21520 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74  Compare() compat
21530 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ible function.**
21540 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f   suitable for co
21550 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a  mparing serializ
21560 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ed records to th
21570 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  e unpacked recor
21580 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  d passed.** as t
21590 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
215a0 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61  ..*/.RecordCompa
215b0 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  re sqlite3VdbeFi
215c0 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b  ndCompare(Unpack
215d0 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
215e0 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  /* varintRecordC
215f0 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
21600 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
21610 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68  areString() both
21620 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61   assume.  ** tha
21630 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
21640 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74  ader varint that
21650 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
21660 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63  tart of each rec
21670 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e  ord.  ** fits in
21680 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28   a single byte (
21690 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c  i.e. is 127 or l
216a0 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f  ess). varintReco
216b0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20  rdCompareInt(). 
216c0 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   ** also assumes
216d0 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
216e0 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62   to overread a b
216f0 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73  uffer by at leas
21700 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69  t the .  ** maxi
21710 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67  mum possible leg
21720 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70  al header size p
21730 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63  lus 8 bytes. Bec
21740 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20  ause there is.  
21750 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
21760 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20   be at least 74 
21770 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79  (but not 136) by
21780 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66  tes of padding f
21790 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20  ollowing each.  
217a0 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
217b0 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64   to varintRecord
217c0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69  CompareInt() thi
217d0 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65  s makes it conve
217e0 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69  nient to.  ** li
217f0 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  mit the size of 
21800 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34  the header to 64
21810 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20   bytes in cases 
21820 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20  where the first 
21830 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e  field.  ** is an
21840 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20   integer..  **. 
21850 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20   ** The easiest 
21860 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  way to enforce t
21870 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20  his limit is to 
21880 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65  consider only re
21890 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20  cords with.  ** 
218a0 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73  13 fields or les
218b0 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
218c0 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65  field is an inte
218d0 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  ger, the maximum
218e0 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64   legal.  ** head
218f0 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35  er size is (12*5
21900 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e   + 1 + 1) bytes.
21910 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70    */.  if( (p->p
21920 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
21930 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  + p->pKeyInfo->n
21940 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20  XField)<=13 ){. 
21950 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
21960 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b  ->aMem[0].flags;
21970 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79  .    if( p->pKey
21980 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
21990 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  [0] ){.      p->
219a0 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  r1 = 1;.      p-
219b0 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  >r2 = -1;.    }e
219c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  lse{.      p->r1
219d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
219e0 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  r2 = 1;.    }.  
219f0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
21a00 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20  EM_Int) ){.     
21a10 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
21a20 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20  rdCompareInt;.  
21a30 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
21a40 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
21a50 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
21a60 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
21a70 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Null );.    test
21a80 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
21a90 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66  M_Blob );.    if
21aa0 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  ( (flags & (MEM_
21ab0 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  Real|MEM_Null|ME
21ac0 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70  M_Blob))==0 && p
21ad0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ->pKeyInfo->aCol
21ae0 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  l[0]==0 ){.     
21af0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
21b00 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
21b10 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
21b20 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
21b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
21b40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
21b50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
21b60 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
21b70 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
21b80 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
21b90 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
21ba0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
21bb0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
21bc0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
21bd0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
21be0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
21bf0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
21c00 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
21c10 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
21c20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
21c30 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
21c40 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
21c50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
21c60 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
21c70 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
21c80 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
21c90 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
21ca0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
21cb0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
21cc0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
21cd0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21ce0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
21cf0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
21d00 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
21d10 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
21d20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
21d30 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
21d40 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
21d50 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
21d60 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
21d70 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
21d80 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
21d90 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
21da0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
21db0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
21dc0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
21dd0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
21de0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
21df0 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
21e00 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
21e10 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
21e20 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
21e30 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
21e40 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
21e50 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
21e60 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
21e70 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
21e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
21e90 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
21ea0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
21eb0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
21ec0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
21ed0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
21ee0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
21ef0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
21f00 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
21f10 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
21f20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
21f30 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
21f40 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  ;.  assert( (nCe
21f50 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
21f60 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
21f70 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
21f80 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
21f90 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
21fa0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
21fb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
21fc0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
21fd0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
21fe0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
21ff0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
22000 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
22010 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22020 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
22030 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
22040 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
22050 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
22060 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
22070 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
22080 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
22090 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
220a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
220b0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
220c0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
220d0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
220e0 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
220f0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
22100 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
22110 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
22120 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
22130 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
22140 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
22150 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
22160 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
22170 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
22180 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
22190 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
221a0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
221b0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
221c0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
221d0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
221e0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
221f0 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
22200 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
22210 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22220 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
22230 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22240 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
22250 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22260 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
22270 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
22280 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22290 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
222a0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
222b0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
222c0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
222d0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
222e0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
222f0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
22300 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
22310 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
22320 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20  es[typeRowid];. 
22330 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
22340 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
22350 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
22360 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
22370 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
22380 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
22390 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
223a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
223b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
223c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
223d0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
223e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
223f0 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
22400 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
22410 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
22420 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
22430 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
22440 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
22450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22460 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
22470 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
22480 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
22490 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
224a0 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
224b0 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
224c0 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
224d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
224e0 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
224f0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
22500 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61  testcase( m.szMa
22510 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
22520 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
22530 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
22540 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
22550 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
22560 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
22570 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
22580 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
22590 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
225a0 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
225b0 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
225c0 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
225d0 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
225e0 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
225f0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
22600 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
22610 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
22620 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
22630 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
22640 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
22650 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
22660 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
22670 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
22680 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
22690 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
226a0 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
226b0 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
226c0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
226d0 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
226e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
226f0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
22700 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
22710 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
22720 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
22730 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
22740 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
22750 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
22760 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
22770 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
22780 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
22790 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
227a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
227d0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
227e0 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22800 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
22810 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
22820 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
22830 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
22840 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
22850 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
22860 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22890 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
228a0 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
228b0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
228c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
228d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
228e0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
228f0 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
22900 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
22910 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d   );.  pCur = pC-
22920 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
22930 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
22940 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
22950 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
22960 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
22970 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
22980 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c  Cur);.  /* nCell
22990 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
229a0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
229b0 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
229c0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
229d0 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
229e0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
229f0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
22a00 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
22a10 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
22a20 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
22a30 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
22a40 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
22a50 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
22a60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22a70 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
22a80 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
22a90 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
22aa0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
22ab0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
22ac0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
22ad0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
22ae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22af0 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69   }.  *res = sqli
22b00 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22b10 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
22b20 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
22b30 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
22b40 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
22b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22b60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22b70 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
22b80 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
22b90 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
22ba0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
22bb0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
22bc0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
22bd0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
22be0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
22bf0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
22c00 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
22c10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
22c20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22c30 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
22c40 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
22c50 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
22c60 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
22c70 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
22c80 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
22c90 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
22ca0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
22cb0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
22cc0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
22cd0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
22ce0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
22cf0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
22d00 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
22d10 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
22d20 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
22d30 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
22d40 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
22d50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22d60 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
22d70 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
22d80 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
22d90 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
22da0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
22db0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
22dc0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
22dd0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
22de0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
22df0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
22e00 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
22e10 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
22e20 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
22e30 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
22e40 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
22e50 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
22e60 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
22e70 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
22e80 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
22e90 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
22ea0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
22eb0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
22ec0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
22ed0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
22ee0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
22ef0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
22f00 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
22f10 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
22f20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
22f30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
22f40 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
22f50 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
22f60 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
22f70 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
22f80 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
22f90 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
22fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22fb0 20 74 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50   the SQLITE_PREP
22fc0 41 52 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20  ARE flags for a 
22fd0 56 64 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  Vdbe..*/.u8 sqli
22fe0 74 65 33 56 64 62 65 50 72 65 70 61 72 65 46 6c  te3VdbePrepareFl
22ff0 61 67 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ags(Vdbe *v){.  
23000 72 65 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c  return v->prepFl
23010 61 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ags;.}../*.** Re
23020 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23030 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
23040 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
23050 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
23060 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
23070 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
23080 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
23090 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
230a0 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
230b0 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
230c0 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
230d0 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
230e0 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
230f0 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
23100 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
23110 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
23120 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
23130 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
23140 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
23150 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
23160 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
23170 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
23180 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
23190 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
231a0 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
231b0 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
231c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
231d0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
231e0 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
231f0 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
23200 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
23210 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (v->db->flags & 
23220 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53  SQLITE_EnableQPS
23230 47 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  G)==0 );.    if(
23240 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
23250 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
23260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
23270 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
23280 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
23290 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
232a0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
232b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
232c0 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
232d0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
232e0 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
232f0 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
23300 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
23310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
23320 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
23330 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
23350 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
23360 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
23370 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
23380 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
23390 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
233a0 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
233b0 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
233c0 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
233d0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
233e0 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
233f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23400 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
23410 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
23420 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
23430 72 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  r>0 );.  assert(
23440 20 28 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26   (v->db->flags &
23450 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
23460 53 47 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  SG)==0 );.  if( 
23470 69 56 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20  iVar>=32 ){.    
23480 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78  v->expmask |= 0x
23490 38 30 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73  80000000;.  }els
234a0 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
234b0 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
234c0 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
234d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
234e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
234f0 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
23500 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
23510 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
23520 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
23530 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
23540 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
23550 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
23560 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
23570 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
23580 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
23590 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
235a0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
235b0 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
235c0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
235d0 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
235e0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
235f0 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74  Vtab){.  if( pVt
23600 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
23610 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
23620 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69   p->db;.    sqli
23630 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
23640 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
23650 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
23660 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
23670 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
23680 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23690 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
236a0 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45  );.    pVtab->zE
236b0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  rrMsg = 0;.  }.}
236c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
236d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
236e0 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
236f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
23700 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a  UPDATE_HOOK../*.
23710 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
23720 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
23730 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61   NULL, release a
23740 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ny allocations a
23750 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
23760 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  th the memory ce
23770 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d  lls in the p->aM
23780 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f  em[] array. Also
23790 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b   free the Unpack
237a0 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
237b0 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73  cture itself, us
237c0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
237d0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e()..**.** This 
237e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
237f0 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65   to free Unpacke
23800 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
23810 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
23820 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63  ** the vdbeUnpac
23830 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69  kRecord() functi
23840 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65  on found in vdbe
23850 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  api.c..*/.static
23860 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e   void vdbeFreeUn
23870 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a  packed(sqlite3 *
23880 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  db, int nField, 
23890 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
238a0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
238b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
238c0 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b  r(i=0; i<nField;
238d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d   i++){.      Mem
238e0 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
238f0 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  m[i];.      if( 
23900 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20  pMem->zMalloc ) 
23910 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23920 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
23930 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
23940 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20  FreeNN(db, p);. 
23950 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
23960 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
23970 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a  UPDATE_HOOK */..
23980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
23990 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
239a0 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  OOK./*.** Invoke
239b0 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20   the pre-update 
239c0 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73  hook. If this is
239d0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
239e0 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20  LETE pre-update 
239f0 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75  call,.** then cu
23a00 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
23a10 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23a20 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20  nt should point 
23a30 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74  to the row about
23a40 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65  .** to be update
23a50 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
23a60 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
23a70 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72  calls sqlite3_pr
23a80 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a  eupdate_old(),.*
23a90 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76  * the required v
23aa0 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61  alue will be rea
23ab0 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74  d from the row t
23ac0 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
23ad0 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   to..*/.void sql
23ae0 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74  ite3VdbePreUpdat
23af0 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76  eHook(.  Vdbe *v
23b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23b10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
23b20 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
23b30 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a   is invoked by *
23b40 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
23b50 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
23b60 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
23b70 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75   grab old.* valu
23b80 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  es from */.  int
23b90 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23bb0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55  SQLITE_INSERT, U
23bc0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
23bd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23be0 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
23bf0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
23c00 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65   name */.  Table
23c10 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
23c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
23c30 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a  dified table */.
23c40 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20    i64 iKey1,    
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79    /* Initial key
23c70 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
23c80 69 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20  iReg            
23c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23ca0 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e  egister for new.
23cb0 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  * record */.){. 
23cc0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
23cd0 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79  ->db;.  i64 iKey
23ce0 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70  2;.  PreUpdate p
23cf0 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73  reupdate;.  cons
23d00 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70  t char *zTbl = p
23d10 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74  Tab->zName;.  st
23d20 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61  atic const u8 fa
23d30 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  keSortOrder = 0;
23d40 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
23d50 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b  pPreUpdate==0 );
23d60 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70  .  memset(&preup
23d70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  date, 0, sizeof(
23d80 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69  PreUpdate));.  i
23d90 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
23da0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79  )==0 ){.    iKey
23db0 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20  1 = iKey2 = 0;. 
23dc0 20 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b     preupdate.pPk
23dd0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
23de0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
23df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
23e00 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  ( op==SQLITE_UPD
23e10 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65  ATE ){.      iKe
23e20 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65  y2 = v->aMem[iRe
23e30 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  g].u.i;.    }els
23e40 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d  e{.      iKey2 =
23e50 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20   iKey1;.    }.  
23e60 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  }..  assert( pCs
23e70 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
23e80 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c  >nCol .       ||
23e90 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d   (pCsr->nField==
23ea0 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20  pTab->nCol+1 && 
23eb0 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  op==SQLITE_DELET
23ec0 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20  E && iReg==-1). 
23ed0 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65   );..  preupdate
23ee0 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64  .v = v;.  preupd
23ef0 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b  ate.pCsr = pCsr;
23f00 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20  .  preupdate.op 
23f10 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74  = op;.  preupdat
23f20 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67  e.iNewReg = iReg
23f30 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
23f40 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20  yinfo.db = db;. 
23f50 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
23f60 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  fo.enc = ENC(db)
23f70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
23f80 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70  yinfo.nField = p
23f90 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65  Tab->nCol;.  pre
23fa0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61  update.keyinfo.a
23fb0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
23fc0 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b  )&fakeSortOrder;
23fd0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
23fe0 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72  y1 = iKey1;.  pr
23ff0 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20  eupdate.iKey2 = 
24000 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61  iKey2;.  preupda
24010 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  te.pTab = pTab;.
24020 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
24030 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a  e = &preupdate;.
24040 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
24050 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72  Callback(db->pPr
24060 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20  eUpdateArg, db, 
24070 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  op, zDb, zTbl, i
24080 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20  Key1, iKey2);.  
24090 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
240a0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
240b0 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
240c0 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64  e.aRecord);.  vd
240d0 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
240e0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  b, preupdate.key
240f0 69 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31 2c 20 70  info.nField+1, p
24100 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b  reupdate.pUnpack
24110 65 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55  ed);.  vdbeFreeU
24120 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75  npacked(db, preu
24130 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46  pdate.keyinfo.nF
24140 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74  ield+1, preupdat
24150 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b  e.pNewUnpacked);
24160 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65  .  if( preupdate
24170 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  .aNew ){.    int
24180 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
24190 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b   i<pCsr->nField;
241a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
241b0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
241c0 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e  se(&preupdate.aN
241d0 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
241e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
241f0 4e 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  N(db, preupdate.
24200 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  aNew);.  }.}.#en
24210 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
24220 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
24230 4f 4f 4b 20 2a 2f 0a                             OOK */.