/ Hex Artifact Content
Login

Artifact 41d90002d774e234f95d1298fc70d25e3420e8d9ebd65aa270a8b771c5525790:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 61  se = pParse;.  a
03e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
03f0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
0400: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c  sert( pParse->nL
0410: 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  abel==0 );.  ass
0420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70  ert( pParse->nOp
0430: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0440: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0450: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0470: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 72  ** Change the er
0480: 72 6f 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65  ror string store
0490: 64 20 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73  d in Vdbe.zErrMs
04a0: 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  g.*/.void sqlite
04b0: 33 56 64 62 65 45 72 72 6f 72 28 56 64 62 65 20  3VdbeError(Vdbe 
04c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
04d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
04e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
04f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
0500: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
0510: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0520: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a  zFormat);.  p->z
0530: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0540: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
0550: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0560: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
0570: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
0580: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
0590: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
05a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
05b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
05c0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
05d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
05e0: 75 38 20 70 72 65 70 46 6c 61 67 73 29 7b 0a 20  u8 prepFlags){. 
05f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0600: 72 6e 3b 0a 20 20 70 2d 3e 70 72 65 70 46 6c 61  rn;.  p->prepFla
0610: 67 73 20 3d 20 70 72 65 70 46 6c 61 67 73 3b 0a  gs = prepFlags;.
0620: 20 20 69 66 28 20 28 70 72 65 70 46 6c 61 67 73    if( (prepFlags
0630: 20 26 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52   & SQLITE_PREPAR
0640: 45 5f 53 41 56 45 53 51 4c 29 3d 3d 30 20 29 7b  E_SAVESQL)==0 ){
0650: 0a 20 20 20 20 70 2d 3e 65 78 70 6d 61 73 6b 20  .    p->expmask 
0660: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
0670: 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b  t( p->zSql==0 );
0680: 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c  .  p->zSql = sql
0690: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d  ite3DbStrNDup(p-
06a0: 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f  >db, z, n);.}../
06b0: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
06c0: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
06d0: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
06e0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06f0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0700: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
0710: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
0720: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
0730: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
0740: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
0750: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0760: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0770: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0780: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0790: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07a0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07b0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07c0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
07d0: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
07e0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07f0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0800: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0810: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0820: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0830: 70 3b 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73 6b  p;.  pB->expmask
0840: 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a   = pA->expmask;.
0850: 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73 20    pB->prepFlags 
0860: 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73 3b  = pA->prepFlags;
0870: 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61 43  .  memcpy(pB->aC
0880: 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f 75  ounter, pA->aCou
0890: 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42 2d  nter, sizeof(pB-
08a0: 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20 70  >aCounter));.  p
08b0: 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49  B->aCounter[SQLI
08c0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45  TE_STMTSTATUS_RE
08d0: 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f  PREPARE]++;.}../
08e0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
08f0: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0900: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0910: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0920: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0930: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0940: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0950: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0960: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0970: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0980: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
0990: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09b0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09c0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09d0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
09e0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
09f0: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a00: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a10: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a20: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a30: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a40: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a50: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a60: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a70: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0a80: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0a90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0aa0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ab0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ac0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0ad0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0ae0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0af0: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b00: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b10: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b20: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b30: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b40: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b50: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b60: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b70: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0b80: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0b90: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ba0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bb0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0bc0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bd0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0be0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0bf0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c00: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c10: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c20: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c30: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c40: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c50: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c60: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c70: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0c80: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0c90: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0ca0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cb0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0cc0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cd0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0ce0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0cf0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d10: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d20: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d30: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d50: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d60: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d70: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0d80: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0d90: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0da0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0db0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0dc0: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
0dd0: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
0de0: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
0df0: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
0e00: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
0e10: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
0e20: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
0e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
0e40: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
0e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
0e60: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
0e70: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
0e80: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
0e90: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
0ea0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0eb0: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
0ec0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
0ed0: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
0ee0: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
0ef0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
0f00: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
0f10: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0f20: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0f30: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    p->nOpAllo
0f40: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
0f50: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0f60: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0f70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0f80: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0f90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
0fa0: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
0fb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0fd0: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0fe0: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0ff0: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1000: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1010: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1020: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1030: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
1040: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
1050: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
1060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
1070: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
1080: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
1090: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
10a0: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
10b0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
10c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
10d0: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
10e0: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
10f0: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1100: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1110: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1120: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1130: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
1140: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
1150: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
1160: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
1170: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
1180: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
1190: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
11a0: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
11b0: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
11c0: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
11d0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
11e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
11f0: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1200: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1210: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1220: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1230: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
1240: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
1250: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
1260: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
1270: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
1280: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
1290: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
12a0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
12b0: 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65  ssert( p->pParse
12c0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e  ->nOpAlloc<=p->n
12d0: 4f 70 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77  Op );.  if( grow
12e0: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 20  OpArray(p, 1) ) 
12f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65  return 1;.  asse
1300: 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e  rt( p->pParse->n
1310: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1330: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1340: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1350: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1360: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
1370: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1380: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
1390: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
13a0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
13b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
13c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
13d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
13e0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
13f0: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1400: 20 69 66 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e   if( p->pParse->
1410: 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20  nOpAlloc<=i ){. 
1420: 20 20 20 72 65 74 75 72 6e 20 67 72 6f 77 4f 70     return growOp
1430: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1440: 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e   p3);.  }.  p->n
1450: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
1460: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
1470: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
1480: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
1490: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
14a0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
14b0: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
14c0: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
14d0: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
14e0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
14f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1500: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
1510: 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  NTS.  pOp->zComm
1520: 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ent = 0;.#endif.
1530: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1540: 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  BUG.  if( p->db-
1550: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1560: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
1570: 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b  {.    int jj, kk
1580: 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61  ;.    Parse *pPa
1590: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
15a0: 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30  .    for(jj=kk=0
15b0: 3b 20 6a 6a 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  ; jj<pParse->nCo
15c0: 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20  lCache; jj++){. 
15d0: 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c       struct yCol
15e0: 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72 73  Cache *x = pPars
15f0: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a  e->aColCache + j
1600: 6a 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  j;.      printf(
1610: 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22  " r[%d]={%d:%d}"
1620: 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54  , x->iReg, x->iT
1630: 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e  able, x->iColumn
1640: 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20  );.      kk++;. 
1650: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20     }.    if( kk 
1660: 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ) printf("\n");.
1670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
1680: 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d  rintOp(0, i, &p-
1690: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65  >aOp[i]);.    te
16a0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
16b0: 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  int();.  }.#endi
16c0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
16d0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
16e0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
16f0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
1700: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
1710: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f  BE_COVERAGE.  pO
1720: 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b  p->iSrcLine = 0;
1730: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1740: 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   i;.}.int sqlite
1750: 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65  3VdbeAddOp0(Vdbe
1760: 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   *p, int op){.  
1770: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1780: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1790: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
17a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17b0: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  1(Vdbe *p, int o
17c0: 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65  p, int p1){.  re
17d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
17e0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
17f0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1810: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1820: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1830: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1840: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1850: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b   op, p1, p2, 0);
1860: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
1870: 63 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f  code for an unco
1880: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
1890: 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44  o instruction iD
18a0: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
18b0: 65 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20  e3VdbeGoto(Vdbe 
18c0: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a  *p, int iDest){.
18d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50  VdbeAddOp3(p, OP
18f0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c  _Goto, 0, iDest,
1900: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
1910: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73  ate code to caus
1920: 65 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74  e the string zSt
1930: 72 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69  r to be loaded i
1940: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  nto.** register 
1950: 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iDest.*/.int sql
1960: 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
1970: 6e 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ng(Vdbe *p, int 
1980: 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  iDest, const cha
1990: 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75  r *zStr){.  retu
19a0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
19b0: 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(p, OP_Strin
19c0: 67 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c  g8, 0, iDest, 0,
19d0: 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a   zStr, 0);.}../*
19e0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
19f0: 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
1a00: 65 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69  es multiple regi
1a10: 73 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20  sters to string 
1a20: 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f  or integer.** co
1a30: 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65  nstants.  The re
1a40: 67 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69  gisters begin wi
1a50: 74 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63  th iDest and inc
1a60: 72 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76  rease consecutiv
1a70: 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69  ely..** One regi
1a80: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1a90: 7a 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61  zed for each cha
1aa0: 72 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65  racgter in zType
1ab0: 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a  s[].  For each.*
1ac0: 2a 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20  * "s" character 
1ad0: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1ae0: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73   register is a s
1af0: 74 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67  tring if the arg
1b00: 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  ument is.** not 
1b10: 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c  NULL, or OP_Null
1b20: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1b30: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
1b40: 20 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63    For each "i" c
1b50: 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a  haracter.** in z
1b60: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67  Types[], the reg
1b70: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
1b80: 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  ized to an integ
1b90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1ba0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 64 6f   input string do
1bb0: 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20  es not end with 
1bc0: 22 58 22 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52  "X" then an OP_R
1bd0: 65 73 75 6c 74 52 6f 77 20 69 6e 73 74 72 75 63  esultRow instruc
1be0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72  tion.** is gener
1bf0: 61 74 65 64 20 66 6f 72 20 74 68 65 20 76 61 6c  ated for the val
1c00: 75 65 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f  ues inserted..*/
1c10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1c20: 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62 65 20  eMultiLoad(Vdbe 
1c30: 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20 63  *p, int iDest, c
1c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1c50: 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  s, ...){.  va_li
1c60: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  st ap;.  int i;.
1c70: 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61 5f 73    char c;.  va_s
1c80: 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65 73 29  tart(ap, zTypes)
1c90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20  ;.  for(i=0; (c 
1ca0: 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b  = zTypes[i])!=0;
1cb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   i++){.    if( c
1cc0: 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 20 63  =='s' ){.      c
1cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 76  onst char *z = v
1ce0: 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1cf0: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
1d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d10: 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c  p, z==0 ? OP_Nul
1d20: 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  l : OP_String8, 
1d30: 30 2c 20 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a  0, iDest+i, 0, z
1d40: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , 0);.    }else 
1d50: 69 66 28 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20  if( c=='i' ){.  
1d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d70: 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65  ddOp2(p, OP_Inte
1d80: 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20  ger, va_arg(ap, 
1d90: 69 6e 74 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a  int), iDest+i);.
1da0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1db0: 20 67 6f 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65   goto skip_op_re
1dc0: 73 75 6c 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20  sultrow;.    }. 
1dd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1de0: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73  AddOp2(p, OP_Res
1df0: 75 6c 74 52 6f 77 2c 20 69 44 65 73 74 2c 20 69  ultRow, iDest, i
1e00: 29 3b 0a 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c  );.skip_op_resul
1e10: 74 72 6f 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61  trow:.  va_end(a
1e20: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  p);.}../*.** Add
1e30: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1e40: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1e50: 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74  value as a point
1e60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e70: 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
1e80: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
1e90: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
1ea0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
1eb0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ed0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1ee0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1f00: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1f10: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1f20: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1f30: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
1f60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1f70: 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20  4,    /* The P4 
1f80: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1f90: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
1fa0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
1fb0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ype */.){.  int 
1fc0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
1fd0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1fe0: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73  p1, p2, p3);.  s
1ff0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2000: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c  P4(p, addr, zP4,
2010: 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75   p4type);.  retu
2020: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
2030: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2040: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2050: 65 20 70 34 20 76 61 6c 75 65 20 77 69 74 68 20  e p4 value with 
2060: 61 20 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a  a P4_INT64 or.**
2070: 20 50 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a   P4_REAL type..*
2080: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2090: 65 41 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56  eAddOp4Dup8(.  V
20a0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
20b0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
20c0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
20d0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20f0: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2100: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2110: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2120: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2130: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2140: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2150: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2170: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2180: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20   const u8 *zP4, 
2190: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
21a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
21b0: 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20  p4type          
21c0: 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79  /* P4 operand ty
21d0: 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  pe */.){.  char 
21e0: 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65  *p4copy = sqlite
21f0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73  3DbMallocRawNN(s
2200: 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 2c  qlite3VdbeDb(p),
2210: 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70   8);.  if( p4cop
2220: 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70  y ) memcpy(p4cop
2230: 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65  y, zP4, 8);.  re
2240: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
2250: 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31  AddOp4(p, op, p1
2260: 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79  , p2, p3, p4copy
2270: 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  , p4type);.}../*
2280: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
2290: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
22a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22b0: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
22c0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
22d0: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
22e0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
22f0: 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61   needs to mark a
2300: 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20  ll btrees.** as 
2310: 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64  having been used
2320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65  ..**.** The zWhe
2330: 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68  re string must h
2340: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
2350: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2360: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73  alloc()..** This
2370: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61   routine will ta
2380: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ke ownership of 
2390: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
23a0: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
23b0: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
23c0: 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a  eSchemaOp(Vdbe *
23d0: 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  p, int iDb, char
23e0: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *zWhere){.  int
23f0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   j;.  sqlite3Vdb
2400: 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61  eAddOp4(p, OP_Pa
2410: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
2420: 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34  0, 0, zWhere, P4
2430: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
2440: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
2450: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
2460: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
2470: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
2480: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2490: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
24a0: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
24b0: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
24c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
24d0: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
24e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
24f0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2500: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2510: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2520: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
2530: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
2540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2550: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
2560: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
2570: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
2580: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2590: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
25a0: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
25b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25d0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
25e0: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
25f0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
2600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2610: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
2620: 33 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  3);.  if( p->db-
2630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
2640: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
2650: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
2660: 64 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  dr];.    pOp->p4
2670: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
2680: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
2690: 20 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   p4;.  }.  retur
26a0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e  n addr;.}../* In
26b0: 73 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20  sert the end of 
26c0: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a  a co-routine.*/.
26d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
26e0: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62  EndCoroutine(Vdb
26f0: 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65  e *v, int regYie
2700: 6c 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ld){.  sqlite3Vd
2710: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
2720: 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
2730: 59 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Yield);..  /* Cl
2740: 65 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ear the temporar
2750: 79 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65  y register cache
2760: 2c 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69  , thereby ensuri
2770: 6e 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a  ng that each.  *
2780: 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73  * co-routine has
2790: 20 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e   its own indepen
27a0: 64 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69  dent set of regi
27b0: 73 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63  sters, because c
27c0: 6f 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20  o-routines.  ** 
27d0: 6d 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65  might expect the
27e0: 69 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ir registers to 
27f0: 62 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72  be preserved acr
2800: 6f 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c  oss an OP_Yield,
2810: 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63   and.  ** that c
2820: 6f 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c  ould cause probl
2830: 65 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f  ems if two or mo
2840: 72 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61  re co-routines a
2850: 72 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  re using the sam
2860: 65 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  e.  ** temporary
2870: 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a   register..  */.
2880: 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65    v->pParse->nTe
2890: 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e  mpReg = 0;.  v->
28a0: 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
28b0: 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g = 0;.}../*.** 
28c0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
28d0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
28e0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
28f0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
2900: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
2910: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
2920: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
2930: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
2940: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
2950: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
2960: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
2970: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
2980: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
2990: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
29a0: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
29b0: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
29c0: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
29d0: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
29e0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
29f0: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
2a00: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
2a10: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
2a20: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
2a30: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
2a40: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
2a50: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
2a60: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
2a70: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
2a80: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
2a90: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
2aa0: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
2ab0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
2ac0: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
2ad0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
2ae0: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
2af0: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
2b00: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
2b10: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2b20: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
2b30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2b40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
2b50: 65 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a  e *v){.  Parse *
2b60: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20  p = v->pParse;. 
2b70: 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62   int i = p->nLab
2b80: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
2b90: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2ba0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
2bb0: 66 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d  f( (i & (i-1))==
2bc0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  0 ){.    p->aLab
2bd0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  el = sqlite3DbRe
2be0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64  allocOrFree(p->d
2bf0: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20  b, p->aLabel, . 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69        (i*2+1)*si
2c30: 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30  zeof(p->aLabel[0
2c40: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
2c50: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2c60: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
2c70: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2c80: 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ADDR(i);.}../*.*
2c90: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
2ca0: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
2cb0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
2cc0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
2cd0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
2ce0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
2cf0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
2d00: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d10: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
2d20: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
2d30: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
2d40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2d50: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
2d60: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
2d70: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
2d80: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
2d90: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
2da0: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
2db0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2dc0: 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c   assert( j<p->nL
2dd0: 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  abel );.  assert
2de0: 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( j>=0 );.  if( 
2df0: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
2e00: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
2e10: 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  v->nOp;.  }.}../
2e20: 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44  *.** Mark the VD
2e30: 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63  BE as one that c
2e40: 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f  an only be run o
2e50: 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  ne time..*/.void
2e60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f   sqlite3VdbeRunO
2e70: 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29  nlyOnce(Vdbe *p)
2e80: 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  {.  p->runOnlyOn
2e90: 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 1;.}../*.**
2ea0: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
2eb0: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
2ec0: 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69  nly be run multi
2ed0: 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f  ple times..*/.vo
2ee0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
2ef0: 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b  usable(Vdbe *p){
2f00: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2f10: 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 0;.}..#ifdef
2f20: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2f30: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2f40: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2f50: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2f60: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2f70: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2f80: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2f90: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2fa0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
2fb0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
2fc0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
2fd0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2fe0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2ff0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
3000: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
3010: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
3020: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
3030: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
3040: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
3050: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
3060: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
3070: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
3080: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
30b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
30c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
30d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
30e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
30f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
3100: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
3110: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
3120: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
3130: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
3140: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3150: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
3160: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
3170: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
3180: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
3190: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
31a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
31b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
31c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
31d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
31e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
31f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
3200: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
3210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3220: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3230: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
3240: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
3250: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
3260: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
3270: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
3280: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
32b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
32c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
32d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
32e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
32f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
3300: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
3310: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
3320: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
3330: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
3340: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
3350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
3360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
3370: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
3380: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
3390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
33b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
33c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
33d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
33e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
33f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
3400: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
3410: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
3420: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
3430: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
3440: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
3450: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
3460: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
3470: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
3480: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
3490: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
34a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
34b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
34c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
34d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
34e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
34f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
3500: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
3510: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
3520: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
3530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3540: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
3550: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
3560: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
3570: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
3580: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
3590: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
35a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
35b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
35c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
35d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
35e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
35f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
3600: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
3610: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3620: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
3630: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
3640: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
3650: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
3660: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
3670: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
3680: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
3690: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
36a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
36b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
36c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
36d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
36e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
36f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
3700: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
3710: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
3720: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
3730: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
3740: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
3750: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
3760: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
3770: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
3780: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
3790: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
37a0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
37b0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
37c0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
37d0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
37e0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
37f0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
3800: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
3810: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
3820: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
3830: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
3840: 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74  **   *  OP_Creat
3850: 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49 4e 54  eBtree/BTREE_INT
3860: 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43  KEY and OP_InitC
3870: 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20 20 20  oroutine .**    
3880: 20 20 28 66 6f 72 20 43 52 45 41 54 45 20 54 41    (for CREATE TA
3890: 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  BLE AS SELECT ..
38a0: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68  .).**.** Then ch
38b0: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
38c0: 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41  ue of Parse.mayA
38d0: 62 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20  bort is true if 
38e0: 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20  an.** ABORT may 
38f0: 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61  be thrown, or fa
3900: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52  lse otherwise. R
3910: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
3920: 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20   does.** match, 
3930: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3940: 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
3950: 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  n is intended to
3960: 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70   be used as.** p
3970: 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74  art of an assert
3980: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
3990: 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69  e compiler. Simi
39a0: 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
39b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
39c0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
39d0: 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  t(pParse->pVdbe,
39e0: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
39f0: 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c  t) );.*/.int sql
3a00: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
3a10: 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20  yAbort(Vdbe *v, 
3a20: 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20  int mayAbort){. 
3a30: 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20   int hasAbort = 
3a40: 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f  0;.  int hasFkCo
3a50: 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  unter = 0;.  int
3a60: 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20   hasCreateTable 
3a70: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e  = 0;.  int hasIn
3a80: 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b  itCoroutine = 0;
3a90: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64  .  Op *pOp;.  Vd
3aa0: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
3ab0: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
3ac0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
3ad0: 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20  ));.  sIter.v = 
3ae0: 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f  v;..  while( (pO
3af0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
3b00: 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20  sIter))!=0 ){.  
3b10: 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70    int opcode = p
3b20: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
3b30: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44  if( opcode==OP_D
3b40: 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65  estroy || opcode
3b50: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20  ==OP_VUpdate || 
3b60: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61  opcode==OP_VRena
3b70: 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  me .     || ((op
3b80: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
3b90: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
3ba0: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
3bb0: 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66  & ((pOp->p1&0xff
3bc0: 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
3bd0: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
3be0: 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20  =OE_Abort)).    
3bf0: 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72  ){.      hasAbor
3c00: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
3c10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
3c20: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65  ( opcode==OP_Cre
3c30: 61 74 65 42 74 72 65 65 20 26 26 20 70 4f 70 2d  ateBtree && pOp-
3c40: 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b 45  >p3==BTREE_INTKE
3c50: 59 20 29 20 68 61 73 43 72 65 61 74 65 54 61 62  Y ) hasCreateTab
3c60: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  le = 1;.    if( 
3c70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43  opcode==OP_InitC
3c80: 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e  oroutine ) hasIn
3c90: 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  itCoroutine = 1;
3ca0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3cb0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3cc0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3cd0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
3ce0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
3cf0: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
3d00: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20     hasFkCounter 
3d10: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
3d20: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  f.  }.  sqlite3D
3d30: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
3d40: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
3d50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3d60: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
3d70: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
3d80: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
3d90: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
3da0: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
3db0: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
3dc0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
3dd0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
3de0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
3df0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
3e00: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
3e10: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
3e20: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
3e30: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
3e40: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
3e50: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
3e60: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
3e70: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
3e80: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
3e90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
3ea0: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3eb0: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e  ort || hasFkCoun
3ec0: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ter.            
3ed0: 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54    || (hasCreateT
3ee0: 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43  able && hasInitC
3ef0: 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23  oroutine) );.}.#
3f00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f10: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
3f20: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
3f30: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
3f40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3f50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
3f60: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
3f70: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
3f80: 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a  ed.  It loops.**
3f90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
3fa0: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78   opcodes and fix
3fb0: 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69  es up some detai
3fc0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f  ls..**.** (1) Fo
3fd0: 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74  r each jump inst
3fe0: 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e  ruction with a n
3ff0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
4000: 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20   (a label).**   
4010: 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32    resolve the P2
4020: 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74   value to an act
4030: 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ual address..**.
4040: 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74  ** (2) Compute t
4050: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
4060: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75  r of arguments u
4070: 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66  sed by any SQL f
4080: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61  unction.**     a
4090: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61  nd store that va
40a0: 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63  lue in *pMaxFunc
40b0: 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20  Args..**.** (3) 
40c0: 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e  Update the Vdbe.
40d0: 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62  readOnly and Vdb
40e0: 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67  e.bIsReader flag
40f0: 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a  s to accurately.
4100: 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20  **     indicate 
4110: 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65  what the prepare
4120: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75  d statement actu
4130: 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a  ally does..**.**
4140: 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20   (4) Initialize 
4150: 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20  the p4.xAdvance 
4160: 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64  pointer on opcod
4170: 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a  es that use it..
4180: 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69  **.** (5) Reclai
4190: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  m the memory all
41a0: 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69  ocated for stori
41b0: 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a  ng labels..**.**
41c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
41d0: 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e  ll only function
41e0: 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68   correctly if th
41f0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  e mkopcodeh.tcl 
4200: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72  generator.** scr
4210: 69 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20  ipt numbers the 
4220: 6f 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c  opcodes correctl
4230: 79 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74  y.  Changes to t
4240: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
4250: 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74   be.** coordinat
4260: 65 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20  ed with changes 
4270: 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  to mkopcodeh.tcl
4280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4290: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
42a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
42b0: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
42c0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
42d0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
42e0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
42f0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
4300: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
4310: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
4320: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
4330: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
4340: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70  sReader = 0;.  p
4350: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  Op = &p->aOp[p->
4360: 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28  nOp-1];.  while(
4370: 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  1){..    /* Only
4380: 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e   JUMP opcodes an
4390: 64 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74  d the short list
43a0: 20 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f   of special opco
43b0: 64 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63  des in the switc
43c0: 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e  h.    ** below n
43d0: 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
43e0: 65 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63  ered.  The mkopc
43f0: 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74  odeh.tcl generat
4400: 6f 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73  or script groups
4410: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73  .    ** all thes
4420: 65 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68  e opcodes togeth
4430: 65 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e  er near the fron
4440: 74 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  t of the opcode 
4450: 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20  list.  Skip.    
4460: 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68  ** any opcode th
4470: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
4480: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76   processing by v
4490: 69 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61  irtual of the fa
44a0: 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  ct that.    ** i
44b0: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
44c0: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
44d0: 4f 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72  OPCODE, as a per
44e0: 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
44f0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
4500: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
4510: 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  e<=SQLITE_MX_JUM
4520: 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20  P_OPCODE ){.    
4530: 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75    /* NOTE: Be su
4540: 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f  re to update mko
4550: 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20  pcodeh.tcl when 
4560: 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69  adding or removi
4570: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65  ng.      ** case
4580: 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74  s from this swit
4590: 63 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ch! */.      swi
45a0: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
45b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
45c0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a   OP_Transaction:
45d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
45e0: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d   pOp->p2!=0 ) p-
45f0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
4600: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c           /* fall
4610: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20   thru */.       
4620: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4630: 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20  OP_AutoCommit:. 
4640: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
4650: 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20  avepoint: {.    
4660: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4670: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4690: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
46a0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
46b0: 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b     case OP_Check
46c0: 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20  point:.#endif.  
46d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61        case OP_Va
46e0: 63 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61  cuum:.        ca
46f0: 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  se OP_JournalMod
4700: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e: {.          p
4710: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
4720: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73            p->bIs
4730: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
4760: 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20  ase OP_Next:.   
4770: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4780: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20  tIfOpen:.       
4790: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
47a0: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
47b0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
47c0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
47d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
47e0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
47f0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4800: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
4810: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
4820: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
4830: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
4840: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
4850: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
4860: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
4870: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
4880: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
4890: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
48a0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
48b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
48c0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
48d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
48e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
48f0: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20  case OP_Prev:.  
4900: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
4910: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20  evIfOpen: {.    
4920: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
4930: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
4940: 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20  BtreePrevious;. 
4950: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
4960: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
4970: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E;.          /* 
4980: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
4990: 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61  or never codes a
49a0: 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f  ny of these opco
49b0: 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20  des as a jump.  
49c0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20          ** to a 
49d0: 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65  label.  They are
49e0: 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73   always coded as
49f0: 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64   a jump backward
4a00: 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20  s to a .        
4a10: 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65    ** known addre
4a20: 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ss */.          
4a30: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
4a40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
4a50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4a60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4a70: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4a80: 45 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  E.        case O
4a90: 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20  P_VUpdate: {.   
4aa0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
4ab0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
4ac0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
4ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4ae0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4af0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69       case OP_VFi
4b00: 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  lter: {.        
4b10: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
4b20: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20     assert( (pOp 
4b30: 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29  - p->aOp) >= 3 )
4b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
4b50: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
4b60: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
4b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
4b80: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
4b90: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
4ba0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
4bb0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  = n;.          /
4bc0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
4bd0: 6e 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20  nto the default 
4be0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  case */.        
4bf0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
4c00: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4c10: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
4c20: 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2<0 ){.         
4c30: 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f     /* The mkopco
4c40: 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68  deh.tcl script h
4c50: 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74  as so arranged t
4c60: 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f  hings that the o
4c70: 6e 6c 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  nly.            
4c80: 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f  ** non-jump opco
4c90: 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20 53 51  des less than SQ
4ca0: 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44  LITE_MX_JUMP_COD
4cb0: 45 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  E are guaranteed
4cc0: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
4cd0: 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61  ** have non-nega
4ce0: 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20  tive values for 
4cf0: 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  P2. */.         
4d00: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69     assert( (sqli
4d10: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
4d20: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26  y[pOp->opcode] &
4d30: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
4d40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
4d50: 73 73 65 72 74 28 20 41 44 44 52 28 70 4f 70 2d  ssert( ADDR(pOp-
4d60: 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61  >p2)<pParse->nLa
4d70: 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  bel );.         
4d80: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
4d90: 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32  bel[ADDR(pOp->p2
4da0: 29 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  )];.          }.
4db0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4dc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4dd0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
4de0: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63  mkopcodeh.tcl sc
4df0: 72 69 70 74 20 68 61 73 20 73 6f 20 61 72 72 61  ript has so arra
4e00: 6e 67 65 64 20 74 68 69 6e 67 73 20 74 68 61 74  nged things that
4e10: 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20   the only.      
4e20: 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f  ** non-jump opco
4e30: 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20 53 51  des less than SQ
4e40: 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44  LITE_MX_JUMP_COD
4e50: 45 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  E are guaranteed
4e60: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 68 61 76   to.      ** hav
4e70: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76  e non-negative v
4e80: 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f  alues for P2. */
4e90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4ea0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
4eb0: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
4ec0: 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d  e]&OPFLG_JUMP)==
4ed0: 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e 3d 30 29  0 || pOp->p2>=0)
4ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4ef0: 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72  pOp==p->aOp ) br
4f00: 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a  eak;.    pOp--;.
4f10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4f20: 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73  ree(p->db, pPars
4f30: 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50  e->aLabel);.  pP
4f40: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  arse->aLabel = 0
4f50: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  ;.  pParse->nLab
4f60: 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46  el = 0;.  *pMaxF
4f70: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
4f80: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  gs;.  assert( p-
4f90: 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c  >bIsReader!=0 ||
4fa0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
4fb0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
4fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4fd0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
4fe0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
4ff0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
5000: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5010: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5020: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
5030: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5040: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5050: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
5060: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  Op;.}../*.** Ver
5070: 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61 73  ify that at leas
5080: 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73  t N opcode slots
5090: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69   are available i
50a0: 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  n p without.** h
50b0: 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20  aving to malloc 
50c0: 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20 28  for more space (
50d0: 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d 70  except when comp
50e0: 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51  iled using.** SQ
50f0: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
5100: 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69 73  C_STRESS).  This
5110: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73   interface is us
5120: 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
5130: 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20 74  g.** to verify t
5140: 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c 6c  hat certain call
5150: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
5160: 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e 20  AddOpList() can 
5170: 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75  never.** fail du
5180: 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74  e to a OOM fault
5190: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20   and hence that 
51a0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
51b0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
51c0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
51d0: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e  will always be n
51e0: 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20  on-NULL..*/.#if 
51f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5200: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
5210: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
5220: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
5230: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
5240: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
5250: 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  ired(Vdbe *p, in
5260: 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
5270: 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d  p->nOp + N <= p-
5280: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
5290: 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  c );.}.#endif../
52a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
52b0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
52c0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
52d0: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ent does not con
52e0: 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65  tain.** an OP_Re
52f0: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20  sultRow opcode. 
5300: 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28 29  Fail an assert()
5310: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68 69   if it does. Thi
5320: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79 20  s is used.** by 
5330: 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e 63  code in pragma.c
5340: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
5350: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
5360: 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a  on of certain.**
5370: 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74   pragmas comport
5380: 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73  s with the flags
5390: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
53a0: 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74 63  e mkpragmatab.tc
53b0: 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a  l.** script..*/.
53c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
53d0: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
53e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
53f0: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
5400: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
5410: 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
5420: 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Row(Vdbe *p){.  
5430: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5440: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
5450: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
5460: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
5470: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a  OP_ResultRow );.
5480: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
5490: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
54a0: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
54b0: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
54c0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
54d0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
54e0: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
54f0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5500: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
5510: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
5520: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
5530: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
5540: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
5550: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
5560: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
5570: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
5580: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
5590: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
55a0: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
55b0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
55c0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
55d0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
55e0: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
55f0: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
5600: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
5610: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
5620: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
5630: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
5640: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
5650: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
5660: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
5670: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
5680: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
5690: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
56a0: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
56b0: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
56c0: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
56d0: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
56e0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
56f0: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
5700: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
5710: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
5720: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
5730: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
5740: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
5750: 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
5760: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
5770: 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73  eMask) );..  res
5780: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
5790: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
57a0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
57b0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
57c0: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
57d0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
57e0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
57f0: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
5800: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
5810: 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
5820: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
5830: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
5840: 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32  *.** Non-zero P2
5850: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75   arguments to ju
5860: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
5870: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
5880: 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f  y adjusted.** so
5890: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74   that the jump t
58a0: 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69 76  arget is relativ
58b0: 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f  e to the first o
58c0: 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65  peration inserte
58d0: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
58e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
58f0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  st(.  Vdbe *p,  
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5910: 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65     /* Add opcode
5920: 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72 65  s to the prepare
5930: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
5940: 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20   int nOp,       
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5960: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64   Number of opcod
5970: 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56  es to add */.  V
5980: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
5990: 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  *aOp,       /* T
59a0: 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  he opcodes to be
59b0: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
59c0: 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20  iLineno         
59d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
59e0: 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d  ce-file line num
59f0: 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63  ber of first opc
5a00: 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ode */.){.  int 
5a10: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75  i;.  VdbeOp *pOu
5a20: 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73  t, *pFirst;.  as
5a30: 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20  sert( nOp>0 );. 
5a40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5a50: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5a60: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
5a70: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50  Op + nOp > p->pP
5a80: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26  arse->nOpAlloc &
5a90: 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  & growOpArray(p,
5aa0: 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74   nOp) ){.    ret
5ab0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69  urn 0;.  }.  pFi
5ac0: 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d  rst = pOut = &p-
5ad0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20  >aOp[p->nOp];.  
5ae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
5af0: 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74  i++, aOp++, pOut
5b00: 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f  ++){.    pOut->o
5b10: 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63  pcode = aOp->opc
5b20: 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  ode;.    pOut->p
5b30: 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20  1 = aOp->p1;.   
5b40: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d   pOut->p2 = aOp-
5b50: 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >p2;.    assert(
5b60: 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   aOp->p2>=0 );. 
5b70: 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f     if( (sqlite3O
5b80: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f  pcodeProperty[aO
5b90: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
5ba0: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61  LG_JUMP)!=0 && a
5bb0: 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20  Op->p2>0 ){.    
5bc0: 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d    pOut->p2 += p-
5bd0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
5be0: 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e  pOut->p3 = aOp->
5bf0: 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  p3;.    pOut->p4
5c00: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
5c10: 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  D;.    pOut->p4.
5c20: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d  p = 0;.    pOut-
5c30: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
5c40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
5c50: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
5c60: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
5c70: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
5c80: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
5c90: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f  _COVERAGE.    pO
5ca0: 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69  ut->iSrcLine = i
5cb0: 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a  Lineno+i;.#else.
5cc0: 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e      (void)iLinen
5cd0: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  o;.#endif.#ifdef
5ce0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
5cf0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
5d00: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
5d10: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
5d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
5d30: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e  rintOp(0, i+p->n
5d40: 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d  Op, &p->aOp[i+p-
5d50: 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  >nOp]);.    }.#e
5d60: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f  ndif.  }.  p->nO
5d70: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75  p += nOp;.  retu
5d80: 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69  rn pFirst;.}..#i
5d90: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5da0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
5db0: 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41  NSTATUS)./*.** A
5dc0: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
5dd0: 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e  he array of coun
5de0: 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ters managed by 
5df0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
5e00: 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f  nstatus()..*/.vo
5e10: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  id sqlite3VdbeSc
5e20: 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65  anStatus(.  Vdbe
5e30: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
5e50: 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61  M to add scansta
5e60: 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e  tus() to */.  in
5e70: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20  t addrExplain,  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5e90: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
5ea0: 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
5eb0: 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c  .  int addrLoop,
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5ee0: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
5ef0: 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69   .  int addrVisi
5f00: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5f10: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5f20: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63  f rows visited c
5f30: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45  ounter */.  LogE
5f40: 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20  st nEst,        
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
5f60: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
5f70: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
5f80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5f90: 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  zName           
5fa0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5fb0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65  able or index be
5fc0: 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29  ing scanned */.)
5fd0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
5fe0: 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73  (p->nScan+1) * s
5ff0: 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73  izeof(ScanStatus
6000: 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20  );.  ScanStatus 
6010: 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20  *aNew;.  aNew = 
6020: 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c  (ScanStatus*)sql
6030: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
6040: 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e  >db, p->aScan, n
6050: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65  Byte);.  if( aNe
6060: 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61  w ){.    ScanSta
6070: 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65  tus *pNew = &aNe
6080: 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20  w[p->nScan++];. 
6090: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70     pNew->addrExp
60a0: 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61  lain = addrExpla
60b0: 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  in;.    pNew->ad
60c0: 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f  drLoop = addrLoo
60d0: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  p;.    pNew->add
60e0: 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73  rVisit = addrVis
60f0: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45  it;.    pNew->nE
6100: 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  st = nEst;.    p
6110: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
6120: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e  ite3DbStrDup(p->
6130: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
6140: 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b  p->aScan = aNew;
6150: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
6160: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6170: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70   value of the op
6180: 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c  code, or P1, P2,
6190: 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61   P3, or P5 opera
61a0: 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65  nds.** for a spe
61b0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
61c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
61d0: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
61e0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  de(Vdbe *p, u32 
61f0: 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63  addr, u8 iNewOpc
6200: 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ode){.  sqlite3V
6210: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
6220: 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f  ->opcode = iNewO
6230: 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71  pcode;.}.void sq
6240: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6250: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
6260: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
6270: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6280: 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20  p(p,addr)->p1 = 
6290: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
62a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
62b0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
62c0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
62d0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
62e0: 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61  p,addr)->p2 = va
62f0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
6300: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
6310: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
6320: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
6330: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
6340: 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b  addr)->p3 = val;
6350: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
6360: 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65  dbeChangeP5(Vdbe
6370: 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20   *p, u16 p5){.  
6380: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6390: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
63a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
63b0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61   p->nOp>0 ) p->a
63c0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
63d0: 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = p5;.}../*.** C
63e0: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
63f0: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
6400: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
6410: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
6420: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
6430: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
6440: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
6450: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6460: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
6470: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
6480: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
6490: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
64a0: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
64b0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
64c0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
64d0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
64e0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
64f0: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
6500: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
6510: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
6520: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
6530: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
6540: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
6550: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
6560: 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65  Def){.  if( (pDe
6570: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
6580: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
6590: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
65a0: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
65b0: 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  pDef);.  }.}..st
65c0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
65d0: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
65e0: 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b  3 *, Op *, int);
65f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6600: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
6610: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
6620: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
6630: 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d  E void freeP4Mem
6640: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65  (sqlite3 *db, Me
6650: 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  m *p){.  if( p->
6660: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
6670: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
6680: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69  zMalloc);.  sqli
6690: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
66a0: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c  p);.}.static SQL
66b0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
66c0: 64 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28  d freeP4FuncCtx(
66d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c  sqlite3 *db, sql
66e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29  ite3_context *p)
66f0: 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72 61  {.  freeEphemera
6700: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d  lFunction(db, p-
6710: 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65  >pFunc);. sqlite
6720: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
6730: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6740: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
6750: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
6760: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73  void *p4){.  ass
6770: 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69  ert( db );.  swi
6780: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
6790: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
67a0: 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65  TX: {.      free
67b0: 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73  P4FuncCtx(db, (s
67c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
67d0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
67e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
67f0: 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61   P4_REAL:.    ca
6800: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
6810: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
6820: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  :.    case P4_IN
6830: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
6840: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6850: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  , p4);.      bre
6860: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6870: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6880: 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70  .      if( db->p
6890: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
68a0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
68b0: 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70  nref((KeyInfo*)p
68c0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
68d0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
68e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
68f0: 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73  OR_HINTS.    cas
6900: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20  e P4_EXPR: {.   
6910: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6920: 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29  lete(db, (Expr*)
6930: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
6940: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6950: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
6960: 45 46 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65  EF: {.      free
6970: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
6980: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
6990: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
69a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
69b0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
69c0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
69d0: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
69e0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
69f0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
6a00: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
6a10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
6a20: 72 65 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65  reeP4Mem(db, (Me
6a30: 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a  m*)p4);.      }.
6a40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6a50: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56   }.    case P4_V
6a60: 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66  TAB : {.      if
6a70: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6a80: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
6a90: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
6aa0: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  e *)p4);.      b
6ab0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6ac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6ad0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
6ae0: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
6af0: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
6b00: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
6b10: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
6b20: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
6b30: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
6b40: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
6b50: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
6b60: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
6b70: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
6b80: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
6b90: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
6ba0: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
6bb0: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
6bc0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61  ;.    for(pOp=&a
6bd0: 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d  Op[nOp-1]; pOp>=
6be0: 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20  aOp; pOp--){.   
6bf0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
6c00: 70 65 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49 46  pe <= P4_FREE_IF
6c10: 5f 4c 45 20 29 20 66 72 65 65 50 34 28 64 62 2c  _LE ) freeP4(db,
6c20: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
6c30: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
6c40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
6c50: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
6c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
6c70: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
6c80: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
6c90: 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71     .    }.    sq
6ca0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
6cb0: 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , aOp);.  }.}../
6cc0: 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75  *.** Link the Su
6cd0: 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20  bProgram object 
6ce0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6cf0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e  cond argument in
6d00: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a  to the linked.**
6d10: 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53   list at Vdbe.pS
6d20: 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20  ubProgram. This 
6d30: 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20  list is used to 
6d40: 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70  delete all sub-p
6d50: 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74  rogram.** object
6d60: 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73  s when the VM is
6d70: 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
6d80: 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  red..*/.void sql
6d90: 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50  ite3VdbeLinkSubP
6da0: 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64  rogram(Vdbe *pVd
6db0: 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  be, SubProgram *
6dc0: 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  p){.  p->pNext =
6dd0: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
6de0: 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  ;.  pVdbe->pProg
6df0: 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  ram = p;.}../*.*
6e00: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63  * Change the opc
6e10: 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f  ode at addr into
6e20: 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20   OP_Noop.*/.int 
6e30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6e40: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
6e50: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64   int addr){.  Vd
6e60: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
6e70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6e80: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
6e90: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
6ea0: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
6eb0: 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  p );.  pOp = &p-
6ec0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
6ed0: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
6ee0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
6ef0: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  .p);.  pOp->p4ty
6f00: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
6f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30  .  pOp->p4.z = 0
6f20: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
6f30: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74  = OP_Noop;.  ret
6f40: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
6f50: 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f  If the last opco
6f60: 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69  de is "op" and i
6f70: 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20  t is not a jump 
6f80: 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20  destination,.** 
6f90: 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20  then remove it. 
6fa0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6fb0: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f  and only if an o
6fc0: 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65  pcode was remove
6fd0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6fe0: 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72  3VdbeDeletePrior
6ff0: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
7000: 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d  u8 op){.  if( p-
7010: 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70  >nOp>0 && p->aOp
7020: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64  [p->nOp-1].opcod
7030: 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74  e==op ){.    ret
7040: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
7050: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
7060: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73  ->nOp-1);.  }els
7070: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
7080: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
7090: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
70a0: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
70b0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
70c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
70d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
70e0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
70f0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
7100: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
7110: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
7120: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
7130: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
7140: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
7150: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
7160: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
7170: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
7180: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
7190: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
71a0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
71b0: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
71c0: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
71d0: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
71e0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
71f0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
7200: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
7210: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
7220: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
7230: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
7240: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
7250: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
7260: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
7270: 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zP4..** .** Othe
7280: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
7290: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
72a0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
72b0: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
72c0: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
72d0: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
72e0: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
72f0: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
7300: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
7310: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
7320: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
7330: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
7340: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
7350: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
7360: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
7370: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
7380: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
7390: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
73a0: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
73b0: 4e 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46  NE vdbeChangeP4F
73c0: 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a  ull(.  Vdbe *p,.
73d0: 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e    Op *pOp,.  con
73e0: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20  st char *zP4,.  
73f0: 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70  int n.){.  if( p
7400: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
7410: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
7420: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
7430: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70  ->p4.p);.    pOp
7440: 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20  ->p4type = 0;.  
7450: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
7460: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29  .  }.  if( n<0 )
7470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7480: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e  eChangeP4(p, (in
7490: 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  t)(pOp - p->aOp)
74a0: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c  , zP4, n);.  }el
74b0: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
74c0: 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   ) n = sqlite3St
74d0: 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20  rlen30(zP4);.   
74e0: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c   pOp->p4.z = sql
74f0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d  ite3DbStrNDup(p-
7500: 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  >db, zP4, n);.  
7510: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7520: 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a  P4_DYNAMIC;.  }.
7530: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7540: 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20  beChangeP4(Vdbe 
7550: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
7560: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69  nst char *zP4, i
7570: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
7580: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7590: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
75a0: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
75b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
75c0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
75d0: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
75e0: 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64  ( p->aOp!=0 || d
75f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7600: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
7610: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7620: 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20   if( n!=P4_VTAB 
7630: 29 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20  ) freeP4(db, n, 
7640: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
7650: 26 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72  &zP4);.    retur
7660: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
7670: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
7680: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
7690: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
76a0: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
76b0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
76c0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
76d0: 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e  [addr];.  if( n>
76e0: 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70  =0 || pOp->p4typ
76f0: 65 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61  e ){.    vdbeCha
7700: 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70  ngeP4Full(p, pOp
7710: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72  , zP4, n);.    r
7720: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
7730: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
7740: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
7750: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
7760: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
7770: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
7780: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
7790: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
77a0: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
77b0: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
77c0: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
77d0: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
77e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
77f0: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
7800: 65 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a  e if( zP4!=0 ){.
7810: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20      assert( n<0 
7820: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
7830: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
7840: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
7850: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
7860: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56  .    if( n==P4_V
7870: 54 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61  TAB ) sqlite3Vta
7880: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a  bLock((VTable*)z
7890: 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  P4);.  }.}../*.*
78a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20  * Change the P4 
78b0: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d  operand of the m
78c0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
78d0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  ed instruction .
78e0: 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ** to the value 
78f0: 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 61  defined by the a
7900: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
7910: 69 73 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a  is a high-speed.
7920: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ** version of sq
7930: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7940: 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  4()..**.** The P
7950: 34 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e  4 operand must n
7960: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ot have been pre
7970: 76 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e  viously defined.
7980: 20 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a    And the new.**
7990: 20 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20   P4 must not be 
79a0: 50 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73  P4_INT32.  Use s
79b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
79c0: 50 34 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f  P4() in either o
79d0: 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73  f.** those cases
79e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
79f0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 56 64  3VdbeAppendP4(Vd
7a00: 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34  be *p, void *pP4
7a10: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65  , int n){.  Vdbe
7a20: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
7a30: 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26  t( n!=P4_INT32 &
7a40: 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a  & n!=P4_VTAB );.
7a50: 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29    assert( n<=0 )
7a60: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7a70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7a80: 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c     freeP4(p->db,
7a90: 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73   n, pP4);.  }els
7aa0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7ab0: 50 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  P4!=0 );.    ass
7ac0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
7ad0: 0a 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  .    pOp = &p->a
7ae0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20  Op[p->nOp-1];.  
7af0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
7b00: 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45  4type==P4_NOTUSE
7b10: 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  D );.    pOp->p4
7b20: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f  type = n;.    pO
7b30: 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20  p->p4.p = pP4;. 
7b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
7b50: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
7b60: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
7b70: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
7b80: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
7b90: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
7ba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7bb0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
7bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
7bd0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
7be0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7bf0: 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66  >pVdbe;.  KeyInf
7c00: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61  o *pKeyInfo;.  a
7c10: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
7c20: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
7c30: 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d   );.  pKeyInfo =
7c40: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
7c50: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
7c60: 49 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Idx);.  if( pKey
7c70: 49 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Info ) sqlite3Vd
7c80: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b  beAppendP4(v, pK
7c90: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
7ca0: 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  FO);.}..#ifdef S
7cb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7cc0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a  LAIN_COMMENTS./*
7cd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
7ce0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  omment on the mo
7cf0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
7d00: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
7d10: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
7d20: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
7d30: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
7d40: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
7d50: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
7d60: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
7d70: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
7d80: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
7d90: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
7da0: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
7db0: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  ion build..*/.st
7dc0: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43  atic void vdbeVC
7dd0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
7de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7df0: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
7e00: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
7e10: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
7e20: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
7e30: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
7e40: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
7e50: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
7e60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7e70: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
7e80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7e90: 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c  ->aOp );.    sql
7ea0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
7eb0: 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  , p->aOp[p->nOp-
7ec0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  1].zComment);.  
7ed0: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
7ee0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71  1].zComment = sq
7ef0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
7f00: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
7f10: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
7f20: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
7f30: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
7f40: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
7f50: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
7f60: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
7f70: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
7f80: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
7f90: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
7fa0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
7fb0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
7fc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7fd0: 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62  eNoopComment(Vdb
7fe0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7ff0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
8000: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
8010: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
8020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8030: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  p, OP_Noop);.   
8040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
8050: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
8060: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
8070: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
8080: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
8090: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
80a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
80b0: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
80c0: 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  E./*.** Set the 
80d0: 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72  value if the iSr
80e0: 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20  cLine field for 
80f0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63  the previously c
8100: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
8110: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8120: 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62  3VdbeSetLineNumb
8130: 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  er(Vdbe *v, int 
8140: 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65  iLine){.  sqlite
8150: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
8160: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
8170: 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ne;.}.#endif /* 
8180: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
8190: 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RAGE */../*.** R
81a0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
81b0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
81c0: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
81d0: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
81e0: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
81f0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
8200: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
8210: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
8220: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
8230: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
8240: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
8250: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
8260: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
8270: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
8280: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
8290: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
82a0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
82b0: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
82c0: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
82d0: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
82e0: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
82f0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
8300: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
8310: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
8320: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
8330: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
8340: 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69   an OOM fault wi
8350: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
8360: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
8370: 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  the return from 
8380: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
8390: 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   is a valid poin
83a0: 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73  ter.  But becaus
83b0: 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f  e the dummy.opco
83c0: 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d  de is 0,.** dumm
83d0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
83e0: 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69  written to.  Thi
83f0: 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  s is verified by
8400: 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e   code inspection
8410: 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69   and.** by runni
8420: 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64  ng with Valgrind
8430: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
8440: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
8450: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
8460: 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69  {.  /* C89 speci
8470: 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  fies that the co
8480: 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77  nstant "dummy" w
8490: 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
84a0: 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a  ed to all.  ** z
84b0: 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63  eros, which is c
84c0: 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65  orrect.  MSVC ge
84d0: 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e  nerates a warnin
84e0: 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e  g, nevertheless.
84f0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62   */.  static Vdb
8500: 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49  eOp dummy;  /* I
8510: 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77  gnore the MSVC w
8520: 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20  arning about no 
8530: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20  initializer */. 
8540: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
8550: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
8560: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
8570: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
8580: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
8590: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
85a0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
85b0: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
85c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
85d0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
85e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
85f0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
8600: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
8610: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
8620: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
8630: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8640: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8650: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a  IN_COMMENTS)./*.
8660: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
8670: 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f  eger value for o
8680: 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ne of the parame
8690: 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f  ters to the opco
86a0: 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d  de pOp.** determ
86b0: 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65  ined by characte
86c0: 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  r c..*/.static i
86d0: 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68  nt translateP(ch
86e0: 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a  ar c, const Op *
86f0: 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27  pOp){.  if( c=='
8700: 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  1' ) return pOp-
8710: 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32  >p1;.  if( c=='2
8720: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
8730: 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27  p2;.  if( c=='3'
8740: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
8750: 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20  3;.  if( c=='4' 
8760: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34  ) return pOp->p4
8770: 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  .i;.  return pOp
8780: 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->p5;.}../*.** C
8790: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
87a0: 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74  for the "comment
87b0: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42  " field of a VDB
87c0: 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67  E opcode listing
87d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f  ..**.** The Syno
87e0: 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63  psis: field in c
87f0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76  omments in the v
8800: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  dbe.c source fil
8810: 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64  e gets converted
8820: 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20  .** to an extra 
8830: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61  string that is a
8840: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73  ppended to the s
8850: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8860: 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61  ().  In the.** a
8870: 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20  bsence of other 
8880: 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73  comments, this s
8890: 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20  ynopsis becomes 
88a0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
88b0: 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f  he opcode..** So
88c0: 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f  me translation o
88d0: 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ccurs:.**.**    
88e0: 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20     "PX"      -> 
88f0: 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20   "r[X]".**      
8900: 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22   "PX@PY"   ->  "
8910: 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72  r[X..X+Y-1]"  or
8920: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
8930: 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20  0 or 1.**       
8940: 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72  "PX@PY+1" ->  "r
8950: 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20  [X..X+Y]"    or 
8960: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
8970: 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50  .**       "PY..P
8980: 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d  Y"  ->  "r[X..Y]
8990: 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  "      or "r[x]"
89a0: 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74   if y<=x.*/.stat
89b0: 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f  ic int displayCo
89c0: 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f  mment(.  const O
89d0: 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54  p *pOp,     /* T
89e0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20  he opcode to be 
89f0: 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63  commented */.  c
8a00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
8a10: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20    /* Previously 
8a20: 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66  obtained value f
8a30: 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20  or P4 */.  char 
8a40: 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a  *zTemp,       /*
8a50: 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65   Write result he
8a60: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d  re */.  int nTem
8a70: 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  p          /* Sp
8a80: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ace available in
8a90: 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20   zTemp[] */.){. 
8aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
8ab0: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
8ac0: 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20  ar *zSynopsis;. 
8ad0: 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20   int nOpName;.  
8ae0: 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68  int ii, jj;.  ch
8af0: 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a  ar zAlt[50];.  z
8b00: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
8b10: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
8b20: 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61  opcode);.  nOpNa
8b30: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
8b40: 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20  en30(zOpName);. 
8b50: 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70   if( zOpName[nOp
8b60: 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69  Name+1] ){.    i
8b70: 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a  nt seenCom = 0;.
8b80: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
8b90: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e  zSynopsis = zOpN
8ba0: 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b  ame += nOpName +
8bb0: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e   1;.    if( strn
8bc0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49  cmp(zSynopsis,"I
8bd0: 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  F ",3)==0 ){.   
8be0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26     if( pOp->p5 &
8bf0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
8c00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8c10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
8c20: 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20  of(zAlt), zAlt, 
8c30: 22 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20  "r[P2] = (%s)", 
8c40: 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20  zSynopsis+3);.  
8c50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8c60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8c70: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29  ntf(sizeof(zAlt)
8c80: 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67  , zAlt, "if %s g
8c90: 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73  oto P2", zSynops
8ca0: 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20  is+3);.      }. 
8cb0: 20 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d       zSynopsis =
8cc0: 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20   zAlt;.    }.   
8cd0: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
8ce0: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
8cf0: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
8d00: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
8d10: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
8d20: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
8d30: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
8d40: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
8d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8d60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8d70: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
8d80: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
8d90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
8da0: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
8db0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8dc0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8dd0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
8de0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
8df0: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
8e00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
8e10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
8e20: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
8e30: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
8e40: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
8e50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8e60: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
8e70: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
8e80: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
8e90: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
8ea0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
8eb0: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
8ec0: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
8ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
8ee0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
8ef0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
8f00: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
8f10: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
8f20: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
8f30: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
8f40: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
8f50: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
8f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8f70: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
8f80: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
8f90: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8fa0: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
8fb0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8fc0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8fd0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8fe0: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
8ff0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
9000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9010: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
9020: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
9030: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
9040: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
9050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
9060: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
9070: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9080: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
9090: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
90a0: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
90b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
90c0: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
90d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
90e0: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
90f0: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
9100: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
9110: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9120: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
9130: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
9140: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
9150: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
9160: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
9170: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
9180: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
9190: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
91a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
91b0: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
91c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
91d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
91e0: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
91f0: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
9200: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9210: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
9220: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
9230: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
9240: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
9250: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9260: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20  E_DEBUG */..#if 
9270: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
9280: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9290: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
92a0: 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61  HINTS)./*.** Tra
92b0: 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45  nslate the P4.pE
92c0: 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e  xpr value for an
92d0: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f   OP_CursorHint o
92e0: 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a  pcode into text.
92f0: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  ** that can be d
9300: 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20  isplayed in the 
9310: 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50  P4 column of EXP
9320: 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  LAIN output..*/.
9330: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
9340: 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63  layP4Expr(StrAcc
9350: 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78  um *p, Expr *pEx
9360: 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  pr){.  const cha
9370: 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77  r *zOp = 0;.  sw
9380: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9390: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ){.    case TK_S
93a0: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c  TRING:.      sql
93b0: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
93c0: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
93d0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
93e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
93f0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73  INTEGER:.      s
9400: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9410: 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
9420: 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  iValue);.      b
9430: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9440: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71  K_NULL:.      sq
9450: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9460: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
9470: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9480: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
9490: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
94a0: 74 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  tf(p, "r[%d]", p
94b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
94c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
94e0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
94f0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9500: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
9510: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
9520: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
9530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9540: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9550: 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78   "c%d", (int)pEx
9560: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
9570: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9580: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9590: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f  e TK_LT:      zO
95a0: 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62  p = "LT";      b
95b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
95c0: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LE:      zOp =
95d0: 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61   "LE";      brea
95e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
95f0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  T:      zOp = "G
9600: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9610: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
9620: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b       zOp = "GE";
9630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9640: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
9650: 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20    zOp = "NE";   
9660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9670: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
9680: 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20  Op = "EQ";      
9690: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
96a0: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20  TK_IS:      zOp 
96b0: 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65  = "IS";      bre
96c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
96d0: 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22  ISNOT:   zOp = "
96e0: 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b  ISNOT";   break;
96f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
9700: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44  :     zOp = "AND
9710: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
9720: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
9730: 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20     zOp = "OR";  
9740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9750: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
9760: 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  zOp = "ADD";    
9770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9780: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70   TK_STAR:    zOp
9790: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72   = "MUL";     br
97a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
97b0: 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _MINUS:   zOp = 
97c0: 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b  "SUB";     break
97d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
97e0: 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45  M:     zOp = "RE
97f0: 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  M";     break;. 
9800: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
9810: 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e  D:  zOp = "BITAN
9820: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
9830: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
9840: 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20   zOp = "BITOR"; 
9850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9860: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f  e TK_SLASH:   zO
9870: 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62  p = "DIV";     b
9880: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9890: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_LSHIFT:  zOp =
98a0: 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61   "LSHIFT";  brea
98b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
98c0: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52  SHIFT:  zOp = "R
98d0: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
98e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
98f0: 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43  AT:  zOp = "CONC
9900: 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AT";  break;.   
9910: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
9920: 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b    zOp = "MINUS";
9930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9940: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
9950: 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20  Op = "PLUS";    
9960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9970: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20  TK_BITNOT:  zOp 
9980: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65  = "BITNOT";  bre
9990: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
99a0: 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  NOT:     zOp = "
99b0: 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  NOT";     break;
99c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
99d0: 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e  ULL:  zOp = "ISN
99e0: 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ULL";  break;.  
99f0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
9a00: 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  L: zOp = "NOTNUL
9a10: 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
9a20: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
9a30: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9a40: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
9a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
9a60: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
9a70: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9a80: 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29  f(p, "%s(", zOp)
9a90: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45  ;.    displayP4E
9aa0: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c  xpr(p, pExpr->pL
9ab0: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45  eft);.    if( pE
9ac0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
9ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
9ae0: 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c  ccumAppend(p, ",
9af0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73  ", 1);.      dis
9b00: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
9b10: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9b20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
9b30: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
9b40: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
9b50: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
9b60: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
9b70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9b80: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
9b90: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
9ba0: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
9bb0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
9bc0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
9bd0: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
9be0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
9bf0: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
9c00: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
9c10: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
9c20: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
9c30: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
9c40: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
9c50: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
9c60: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
9c70: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
9c80: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
9c90: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
9ca0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
9cb0: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
9cc0: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
9cd0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
9ce0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
9cf0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
9d00: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
9d10: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
9d20: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
9d30: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
9d40: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
9d50: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
9d60: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9d70: 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b  f(&x, "k(%d", pK
9d80: 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
9d90: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  d);.      for(j=
9da0: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
9db0: 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  KeyField; j++){.
9dc0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
9dd0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
9de0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
9df0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9e00: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
9e10: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
9e20: 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  "";.        if( 
9e30: 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42  strcmp(zColl, "B
9e40: 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f  INARY")==0 ) zCo
9e50: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20  ll = "B";.      
9e60: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9e70: 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b  (&x, ",%s%s", pK
9e80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
9e90: 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22  er[j] ? "-" : ""
9ea0: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
9eb0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
9ec0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78  trAccumAppend(&x
9ed0: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ")", 1);.     
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9ef0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9f00: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
9f10: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
9f20: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
9f30: 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d  yP4Expr(&x, pOp-
9f40: 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  >p4.pExpr);.    
9f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9f60: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
9f70: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
9f80: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9f90: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
9fa0: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
9fb0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28 25 2e  XPrintf(&x, "(%.
9fc0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
9fd0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
9fe0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9ff0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
a000: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
a010: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
a020: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
a030: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
a040: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
a050: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
a060: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a070: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
a080: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
a090: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
a0a0: 52 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65  ROFILE).    case
a0b0: 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20   P4_FUNCCTX: {. 
a0c0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
a0d0: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74  ef = pOp->p4.pCt
a0e0: 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  x->pFunc;.      
a0f0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
a100: 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  x, "%s(%d)", pDe
a110: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
a120: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
a130: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
a140: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
a150: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
a160: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a170: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
a180: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
a190: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a1a0: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
a1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a1c0: 6e 74 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f  ntf(&x, "%d", pO
a1d0: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
a1e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a1f0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
a200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
a210: 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67  rintf(&x, "%.16g
a220: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61  ", *pOp->p4.pRea
a230: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
a240: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a250: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
a260: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d  Mem *pMem = pOp-
a270: 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20  >p4.pMem;.      
a280: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
a290: 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
a2a0: 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d       zP4 = pMem-
a2b0: 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  >z;.      }else 
a2c0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
a2d0: 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  & MEM_Int ){.   
a2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a2f0: 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ntf(&x, "%lld", 
a300: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
a310: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
a320: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
a330: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
a340: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
a350: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
a360: 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
a370: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
a380: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
a390: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e          zP4 = "N
a3a0: 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ULL";.      }els
a3b0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
a3c0: 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  t( pMem->flags &
a3d0: 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
a3e0: 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f       zP4 = "(blo
a3f0: 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b)";.      }.   
a400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a410: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a420: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a430: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
a440: 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
a450: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
a460: 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
a470: 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c  pVtab;.      sql
a480: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
a490: 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62  "vtab:%p", pVtab
a4a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a4b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a4c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
a4d0: 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y: {.      int i
a4e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20  ;.      int *ai 
a4f0: 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20  = pOp->p4.ai;.  
a500: 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30      int n = ai[0
a510: 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  ];   /* The firs
a520: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20  t element of an 
a530: 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77 61  INTARRAY is alwa
a540: 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ys the.         
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
a560: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
a570: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
a580: 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
a590: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
a5a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a5b0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
a5c0: 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29  x, ",%d", ai[i])
a5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a5e0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a  zTemp[0] = '[';.
a5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
a600: 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20  AccumAppend(&x, 
a610: 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  "]", 1);.      b
a620: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a630: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
a640: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
a650: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
a660: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
a670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a680: 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43    case P4_ADVANC
a690: 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70  E: {.      zTemp
a6a0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [0] = 0;.      b
a6b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a6c0: 63 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b  case P4_TABLE: {
a6d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
a6e0: 72 69 6e 74 66 28 26 78 2c 20 22 25 73 22 2c 20  rintf(&x, "%s", 
a6f0: 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e  pOp->p4.pTab->zN
a700: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
a710: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
a720: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
a730: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
a740: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
a750: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
a760: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
a770: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
a780: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a790: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
a7a0: 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61  mFinish(&x);.  a
a7b0: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
a7c0: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
a7d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f  .#endif /* VDBE_
a7e0: 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f  DISPLAY_P4 */../
a7f0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20  *.** Declare to 
a800: 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68  the Vdbe that th
a810: 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61  e BTree object a
a820: 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20  t db->aDb[i] is 
a830: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
a840: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a850: 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  nts need to know
a860: 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20   in advance the 
a870: 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a  complete set of.
a880: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
a890: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
a8a0: 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20  be use.  A mask 
a8b0: 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73  of these databas
a8c0: 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69  es.** is maintai
a8d0: 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  ned in p->btreeM
a8e0: 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63  ask.  The p->loc
a8f0: 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74  kMask value is t
a900: 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  he subset of.** 
a910: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20  p->btreeMask of 
a920: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
a930: 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f  ill require a lo
a940: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
a950: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
a960: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
a970: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  {.  assert( i>=0
a980: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
a990: 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f   && i<(int)sizeo
a9a0: 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a  f(yDbMask)*8 );.
a9b0: 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74    assert( i<(int
a9c0: 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65  )sizeof(p->btree
a9d0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d  Mask)*8 );.  DbM
a9e0: 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d  askSet(p->btreeM
a9f0: 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69  ask, i);.  if( i
aa00: 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74  !=1 && sqlite3Bt
aa10: 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64  reeSharable(p->d
aa20: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
aa30: 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
aa40: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b  p->lockMask, i);
aa50: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
aa60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
aa70: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f  _SHARED_CACHE)./
aa80: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
aa90: 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75  s compiled to su
aaa0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
aab0: 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62  he mode and to b
aac0: 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a  e threadsafe,.**
aad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62   this routine ob
aae0: 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20  tains the mutex 
aaf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ab00: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
ab10: 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20  ructure.** that 
ab20: 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20  may be accessed 
ab30: 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
ab40: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
ab50: 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20   In doing so it 
ab60: 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65  also.** sets the
ab70: 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d   BtShared.db mem
ab80: 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74  ber of each of t
ab90: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
aba0: 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67  ctures, ensuring
abb0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72  .** that the cor
abc0: 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65  rect busy-handle
abd0: 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  r callback is in
abe0: 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65  voked if require
abf0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  d..**.** If SQLi
ac00: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
ac10: 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75  safe but does su
ac20: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
ac30: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a  he mode, then.**
ac40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ac50: 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  er() is invoked 
ac60: 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61  to set the BtSha
ac70: 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73  red.db variables
ac80: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74  .** of all of Bt
ac90: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
aca0: 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61  s accessible via
acb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
acc0: 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61  ndle .** associa
acd0: 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e  ted with the VM.
ace0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
acf0: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
ad00: 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  fe and does not 
ad10: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
ad20: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a  ache mode, this.
ad30: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
ad40: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
ad50: 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66  e p->btreeMask f
ad60: 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73  ield is a bitmas
ad70: 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20  k of all btrees 
ad80: 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65  that the prepare
ad90: 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  d .** statement 
ada0: 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e  p will ever use.
adb0: 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e    Let N be the n
adc0: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
add0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a   p->btreeMask.**
ade0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
adf0: 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73  o btrees that us
ae00: 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20  e shared cache. 
ae10: 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d   Then the runtim
ae20: 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75  e of.** this rou
ae30: 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75  tine is N*N.  Bu
ae40: 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79  t as N is rarely
ae50: 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68   more than 1, th
ae60: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  is should not.**
ae70: 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a   be a problem..*
ae80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ae90: 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29  beEnter(Vdbe *p)
aea0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
aeb0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
aec0: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
aed0: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
aee0: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
aef0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
af00: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
af10: 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  /.  db = p->db;.
af20: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
af30: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
af40: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
af50: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
af60: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
af70: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
af80: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
af90: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
afa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
afb0: 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70  eeEnter(aDb[i].p
afc0: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
afd0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
afe0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
aff0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
b000: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
b010: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c  SAFE>0./*.** Unl
b020: 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62  ock all of the b
b030: 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79  trees previously
b040: 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c   locked by a cal
b050: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
b060: 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74  Enter()..*/.stat
b070: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
b080: 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76  NE void vdbeLeav
b090: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
b0a0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
b0b0: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
b0c0: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d   int nDb;.  db =
b0d0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
b0e0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
b0f0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
b100: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
b110: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
b120: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
b130: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
b140: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
b150: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
b160: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b170: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
b180: 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71   }.  }.}.void sq
b190: 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56  lite3VdbeLeave(V
b1a0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44  dbe *p){.  if( D
b1b0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
b1c0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
b1d0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
b1e0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62  on case */.  vdb
b1f0: 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e  eLeave(p);.}.#en
b200: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
b210: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
b220: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
b230: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
b240: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
b250: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
b260: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
b270: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
b280: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b290: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
b2a0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
b2b0: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
b2c0: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
b2d0: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
b2e0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
b2f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
b300: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
b310: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
b320: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
b330: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
b340: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
b350: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
b360: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
b370: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
b380: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b390: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
b3a0: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
b3b0: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
b3c0: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
b3d0: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
b3e0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
b3f0: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69  /* NB:  The sqli
b400: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20  te3OpcodeName() 
b410: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
b420: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20  emented by code 
b430: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20  created.  ** by 
b440: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
b450: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e  k and mkopcodec.
b460: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63  awk scripts whic
b470: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  h extract the.  
b480: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
b490: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73  rom the vdbe.c s
b4a0: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20  ource text */.  
b4b0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
b4c0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
b4d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
b4e0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
b4f0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
b500: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
b510: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20  4, pOp->p5,.    
b520: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66    zCom.  );.  ff
b530: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
b540: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
b550: 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20  ialize an array 
b560: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
b570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b580: 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65   initMemArray(Me
b590: 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c  m *p, int N, sql
b5a0: 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c  ite3 *db, u16 fl
b5b0: 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28  ags){.  while( (
b5c0: 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d  N--)>0 ){.    p-
b5d0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
b5e0: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
b5f0: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
b600: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
b610: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e  TE_DEBUG.    p->
b620: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
b630: 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a  #endif.    p++;.
b640: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
b650: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
b660: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
b670: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
b680: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
b690: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
b6a0: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
b6b0: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
b6c0: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
b6d0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
b6e0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
b6f0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
b700: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
b710: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
b720: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b730: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
b740: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
b750: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
b760: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b770: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
b780: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
b790: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
b7a0: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
b7b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
b7c0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
b7d0: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
b7e0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
b7f0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
b800: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
b810: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
b820: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
b830: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
b840: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
b850: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
b860: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
b870: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
b880: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
b890: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
b8a0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
b8b0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
b8c0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
b8d0: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
b8e0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
b8f0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
b900: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
b910: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
b920: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
b930: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
b940: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
b950: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
b960: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
b970: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
b980: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
b990: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
b9a0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
b9b0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
b9c0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
b9d0: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
b9e0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
b9f0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
ba00: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
ba10: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
ba20: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
ba30: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
ba40: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
ba50: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
ba60: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
ba70: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
ba80: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
ba90: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
baa0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
bab0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
bac0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
bad0: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
bae0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
baf0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
bb00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bb10: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
bb20: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
bb30: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
bb40: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
bb50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
bb60: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
bb70: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
bb80: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
bb90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bba0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
bbb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bbc0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
bbd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
bbe0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d  FreeNN(db, p->zM
bbf0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
bc00: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
bc10: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
bc20: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
bc30: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
bc40: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
bc50: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
bc60: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
bc70: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
bc80: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
bc90: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
bca0: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
bcb0: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
bcc0: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
bcd0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
bce0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bcf0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
bd00: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
bd10: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
bd20: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
bd30: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
bd40: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
bd50: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
bd60: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
bd70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
bd80: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
bd90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bda0: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
bdb0: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
bdc0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
bdd0: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
bde0: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
bdf0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
be00: 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e  a(p->v->db, &p->
be10: 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
be20: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
be30: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
be40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
be50: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
be60: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
be70: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
be80: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
be90: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
bea0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
beb0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
bec0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
bed0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
bee0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
bef0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
bf00: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
bf10: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
bf20: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
bf30: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
bf40: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
bf50: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
bf60: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
bf70: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
bf80: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
bf90: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
bfa0: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
bfb0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
bfc0: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
bfd0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
bfe0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
bff0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
c000: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
c010: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
c020: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
c030: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
c040: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
c050: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
c060: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
c070: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
c080: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
c090: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
c0a0: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
c0b0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
c0c0: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
c0d0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
c0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
c0f0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
c100: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
c130: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
c140: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
c150: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c170: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
c180: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
c190: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
c1a0: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
c1b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
c1c0: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
c1d0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
c1e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c200: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
c210: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
c220: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
c230: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
c240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c250: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
c260: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
c270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c2a0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
c2b0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
c2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c2d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
c2e0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
c2f0: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
c300: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
c310: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
c320: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
c330: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
c340: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
c350: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
c360: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
c370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
c380: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
c390: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
c3a0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
c3b0: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
c3c0: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
c3d0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
c3e0: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
c3f0: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
c400: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
c410: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
c420: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
c430: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
c440: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
c450: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
c460: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
c470: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
c480: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
c490: 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65  em, 8);.  p->pRe
c4a0: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20  sultSet = 0;..  
c4b0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c4c0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a  E_NOMEM_BKPT ){.
c4d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
c4e0: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
c4f0: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
c500: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
c510: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
c520: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
c530: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
c540: 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d.  */.    sqlit
c550: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
c560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c570: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
c580: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
c590: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
c5a0: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
c5b0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
c5c0: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
c5d0: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
c5e0: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
c5f0: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
c600: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
c610: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
c620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
c630: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
c640: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
c650: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c660: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
c670: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
c680: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
c690: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
c6a0: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
c6b0: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
c6c0: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
c6d0: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
c6e0: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
c6f0: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
c700: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
c710: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
c720: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
c730: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
c740: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
c750: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
c760: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
c770: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
c780: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
c790: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
c7a0: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
c7b0: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
c7c0: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
c7d0: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
c7e0: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
c7f0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
c800: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
c810: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
c820: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
c830: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
c840: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
c850: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
c860: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
c870: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
c880: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
c890: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
c8a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c8b0: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
c8c0: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
c8d0: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
c8e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
c8f0: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
c900: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
c910: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
c920: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
c930: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
c940: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
c950: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
c960: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
c970: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
c980: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
c990: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
c9a0: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
c9b0: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
c9c0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
c9d0: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
c9e0: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
c9f0: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
ca00: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
ca10: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
ca20: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
ca30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
ca40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
ca50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
ca60: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
ca70: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
ca80: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
ca90: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
caa0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
cab0: 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
cac0: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
cad0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
cae0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34  e{.    char *zP4
caf0: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  ;.    Op *pOp;. 
cb00: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
cb10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
cb20: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
cb30: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
cb40: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
cb50: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
cb60: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
cb70: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
cb80: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
cb90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
cba0: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
cbb0: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
cbc0: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
cbd0: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
cbe0: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
cbf0: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
cc00: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
cc10: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
cc20: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
cc30: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
cc40: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
cc50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
cc60: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
cc70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cc80: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
cc90: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aOp[i];.    }.  
cca0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
ccb0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
ccc0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
ccd0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
cce0: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
cd10: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
cd20: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
cd30: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
cd40: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
cd50: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
cd60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
cd70: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
cd80: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
cd90: 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65  code); /* Opcode
cda0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
cdb0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
cdc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
cdd0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
cde0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
cdf0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
ce00: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
ce10: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  Mem++;..      /*
ce20: 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67   When an OP_Prog
ce30: 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  ram opcode is en
ce40: 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c  counter (the onl
ce50: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61  y opcode that ha
ce60: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f  s.      ** a P4_
ce70: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
ce80: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
ce90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
cea0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
ceb0: 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20  s.      ** kept 
cec0: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
ced0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
cee0: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
cef0: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
cf00: 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  am.      ** has 
cf10: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
cf20: 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a   seen..      */.
cf30: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
cf40: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
cf50: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  GRAM ){.        
cf60: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
cf70: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
cf80: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
cf90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
cfa0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
cfb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
cfc0: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
cfd0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
cfe0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d000: 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54  j==nSub && SQLIT
d010: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
d020: 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e  eMemGrow(pSub, n
d030: 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29  Byte, nSub!=0) )
d040: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
d050: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
d060: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
d070: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
d080: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
d090: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
d0a0: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
d0b0: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
d0c0: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
d0d0: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
d0e0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
d0f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d100: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
d110: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
d120: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
d130: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d150: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
d160: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
d170: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
d180: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
d190: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
d1c0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
d1d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
d1e0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
d1f0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
d220: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
d230: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
d240: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
d250: 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a  pMem, 100) ){ /*
d260: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   P4 */.      ass
d270: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
d280: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
d290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d2a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
d2b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
d2c0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
d2d0: 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  .    zP4 = displ
d2e0: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
d2f0: 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f  z, pMem->szMallo
d300: 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21  c);.    if( zP4!
d310: 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  =pMem->z ){.    
d320: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20    pMem->n = 0;. 
d330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d340: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
d350: 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zP4, -1, SQLITE_
d360: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
d370: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
d380: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
d390: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
d3a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d3b0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
d3c0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
d3d0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
d3e0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
d3f0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
d400: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
d410: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
d420: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
d430: 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  m, 4) ){.       
d440: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
d450: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d470: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
d480: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
d490: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
d4a0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
d4b0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
d4c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
d4d0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
d4e0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
d4f0: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
d500: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
d510: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
d520: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
d530: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d540: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
d550: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
d560: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
d570: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
d580: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
d590: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
d5a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d5b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d5c0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
d5d0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
d5e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
d5f0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
d600: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c   pMem->n = displ
d610: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
d620: 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30  P4, pMem->z, 500
d630: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
d640: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
d650: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d  ;.#else.      pM
d660: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
d670: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
d680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d690: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
d6a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
d6b0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
d6c0: 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  4*(p->explain-1)
d6d0: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74  ;.    p->pResult
d6e0: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
d6f0: 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ];.    p->rc = S
d700: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
d710: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
d720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d730: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d740: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
d750: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
d760: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
d770: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
d780: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
d790: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
d7a0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
d7b0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
d7c0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
d7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
d7e0: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
d7f0: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
d800: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
d810: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
d820: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
d830: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
d840: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
d850: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
d860: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
d870: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
d880: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
d890: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
d8a0: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
d8b0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
d8c0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
d8d0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
d8e0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
d8f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
d900: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
d910: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
d920: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
d930: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
d940: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
d950: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
d960: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
d970: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
d980: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
d990: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
d9a0: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
d9b0: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
d9c0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
d9d0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
d9e0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
d9f0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
da00: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
da10: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
da20: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
da30: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
da40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
da50: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
da60: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
da70: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
da80: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
da90: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
daa0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
dab0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
dac0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
dad0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
dae0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
daf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
db00: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
db10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
db20: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
db30: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
db40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
db50: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
db60: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
db70: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
db80: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
db90: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
dba0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
dbb0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69  RACE */../* An i
dbc0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
dbd0: 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73  object describes
dbe0: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61   bulk memory ava
dbf0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a  ilable for use.*
dc00: 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e  * by subcomponen
dc10: 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64  ts of a prepared
dc20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61   statement.  Spa
dc30: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ce is allocated 
dc40: 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73  out.** of a Reus
dc50: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
dc60: 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61   by the allocSpa
dc70: 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c  ce() routine bel
dc80: 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65  ow..*/.struct Re
dc90: 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20  usableSpace {.  
dca0: 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  u8 *pSpace;     
dcb0: 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c       /* Availabl
dcc0: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  e memory */.  in
dcd0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
dce0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61     /* Bytes of a
dcf0: 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20  vailable memory 
dd00: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64  */.  int nNeeded
dd10: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74  ;         /* Tot
dd20: 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f  al bytes that co
dd30: 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  uld not be alloc
dd40: 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  ated */.};../* T
dd50: 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e  ry to allocate n
dd60: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d  Byte bytes of 8-
dd70: 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c  byte aligned bul
dd80: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75  k memory for pBu
dd90: 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65  f.** from the Re
dda0: 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65  usableSpace obje
ddb0: 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ct.  Return a po
ddc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
ddd0: 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79  ocated.** memory
dde0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
ddf0: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65   insufficient me
de00: 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mory is availabl
de10: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73  e in the.** Reus
de20: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
de30: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52  , increase the R
de40: 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65  eusableSpace.nNe
de50: 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79  eded.** value by
de60: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64   the amount need
de70: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  ed and return NU
de80: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75  LL..**.** If pBu
de90: 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  f is not initial
dea0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65  ly NULL, that me
deb0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d  ans that the mem
dec0: 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ory has already.
ded0: 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
dee0: 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c  d by a prior cal
def0: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
df00: 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  e, so just retur
df10: 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70  n a copy.** of p
df20: 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65  Buf and leave Re
df30: 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68  usableSpace unch
df40: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anged..**.** Thi
df50: 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65  s allocator is e
df60: 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72  mployed to repur
df70: 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74  pose unused slot
df80: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
df90: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72  the.** opcode ar
dfa0: 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20  ray of prepared 
dfb0: 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20  state for other 
dfc0: 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20  memory needs of 
dfd0: 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  the prepared.** 
dfe0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
dff0: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
e000: 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20  Space(.  struct 
e010: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70  ReusableSpace *p
e020: 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72  ,  /* Bulk memor
e030: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
e040: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
e050: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
e060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
e070: 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20  nter to a prior 
e080: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
e090: 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20  int nByte       
e0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e0b0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65  es of memory nee
e0c0: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ded */.){.  asse
e0d0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
e0e0: 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61  LIGNMENT(p->pSpa
e0f0: 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  ce) );.  if( pBu
e100: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  f==0 ){.    nByt
e110: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
e120: 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
e130: 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a   <= p->nFree ){.
e140: 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d        p->nFree -
e150: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70  = nByte;.      p
e160: 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65  Buf = &p->pSpace
e170: 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20  [p->nFree];.    
e180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
e190: 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65  nNeeded += nByte
e1a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
e1b0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
e1c0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29  _ALIGNMENT(pBuf)
e1d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75   );.  return pBu
e1e0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
e1f0: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
e200: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
e210: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
e220: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
e230: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
e240: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
e250: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
e260: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
e270: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
e280: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
e290: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
e2a0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
e2b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
e2c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
e2d0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
e2e0: 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29  BE_MAGIC_RESET )
e2f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
e300: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
e310: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
e320: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
e330: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
e340: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
e350: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
e360: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
e370: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
e380: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
e390: 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20  IC_RUN;..#ifdef 
e3a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
e3b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=0; i<p->nMe
e3c0: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; i++){.    ass
e3d0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
e3e0: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
e3f0: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20  .#endif.  p->pc 
e400: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
e410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
e420: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
e430: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68  _Abort;.  p->nCh
e440: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
e450: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
e460: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
e470: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
e480: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
e490: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
e4a0: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
e4b0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
e4c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
e4d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
e4e0: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
e4f0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
e500: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
e510: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
e520: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
e530: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
e540: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
e550: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
e560: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
e570: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
e580: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
e590: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
e5a0: 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73  allocating regis
e5b0: 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  ters and initial
e5c0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
e5d0: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
e5e0: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
e5f0: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
e600: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
e610: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
e620: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
e630: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
e640: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
e650: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
e660: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f  d exactly once o
e670: 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d  n each virtual m
e680: 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72  achine..** After
e690: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e6a0: 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68   called the VM h
e6b0: 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65  as been "package
e6c0: 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a  d" and is ready.
e6d0: 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65  ** to run.  Afte
e6e0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
e6f0: 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65  s called, furthe
e700: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
e710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e720: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
e730: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
e740: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
e750: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
e760: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
e770: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
e780: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
e790: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
e7a0: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
e7b0: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
e7c0: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
e7d0: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
e7e0: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
e7f0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
e800: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
e810: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
e820: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
e830: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
e840: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
e850: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
e860: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
e870: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
e880: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
e890: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e8b0: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
e8c0: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e8e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
e8f0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
e900: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
e910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
e920: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e930: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e960: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
e970: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
e9a0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
e9b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
e9c0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
e9d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e9e0: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
e9f0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
ea00: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
ea10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ea20: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
ea30: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
ea40: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ea70: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65  r */.  struct Re
ea80: 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20  usableSpace x;  
ea90: 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c        /* Reusabl
eaa0: 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f  e bulk memory */
eab0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
eac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ead0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
eae0: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
eaf0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
eb00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
eb10: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
eb20: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
eb30: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
eb40: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
eb50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
eb60: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
eb70: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
eb80: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
eb90: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
eba0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
ebb0: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
ebc0: 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20  MaxArg;.  .  /* 
ebd0: 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73  Each cursor uses
ebe0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
ebf0: 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   The first curso
ec00: 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e  r (cursor 0) can
ec10: 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30  .  ** use aMem[0
ec20: 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f  ] which is not o
ec30: 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79  therwise used by
ec40: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
ec50: 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a  m.  Allocate.  *
ec60: 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  * space at the e
ec70: 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72  nd of aMem[] for
ec80: 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67   cursors 1 and g
ec90: 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65  reater..  ** See
eca0: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
ecb0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
ecc0: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
ecd0: 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d  .  if( nCursor==
ece0: 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d  0 && nMem>0 ) nM
ecf0: 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20  em++;  /* Space 
ed00: 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e  for aMem[0] even
ed10: 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a   if not used */.
ed20: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
ed30: 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62   how much reusab
ed40: 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  le memory is ava
ed50: 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e  ilable at the en
ed60: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70  d of the.  ** op
ed70: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69  code array.  Thi
ed80: 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77  s extra memory w
ed90: 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ill be reallocat
eda0: 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65  ed for other ele
edb0: 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  ments.  ** of th
edc0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
edd0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d  ment..  */.  n =
ede0: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f   ROUND8(sizeof(O
edf0: 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20  p)*p->nOp);     
ee00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
ee10: 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f  s of opcode memo
ee20: 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70  ry used */.  x.p
ee30: 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70  Space = &((u8*)p
ee40: 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20  ->aOp)[n];      
ee50: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
ee60: 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  ed opcode memory
ee70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49   */.  assert( EI
ee80: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
ee90: 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a  NT(x.pSpace) );.
eea0: 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e    x.nFree = ROUN
eeb0: 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73  DDOWN8(pParse->s
eec0: 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20  zOpAlloc - n);  
eed0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73  /* Bytes of unus
eee0: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  ed memory */.  a
eef0: 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d  ssert( x.nFree>=
ef00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  0 );.  assert( E
ef10: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
ef20: 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e  ENT(&x.pSpace[x.
ef30: 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65  nFree]) );..  re
ef40: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
ef50: 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73   &nArg);.  p->us
ef60: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20  esStmtJournal = 
ef70: 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d  (u8)(pParse->isM
ef80: 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61  ultiWrite && pPa
ef90: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a  rse->mayAbort);.
efa0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
efb0: 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30  plain && nMem<10
efc0: 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31   ){.    nMem = 1
efd0: 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69  0;.  }.  p->expi
efe0: 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
eff0: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
f000: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
f010: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
f020: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e   allocated in on
f030: 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61  e or two.  ** pa
f040: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
f050: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
f060: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
f070: 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a   memory at the .
f080: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
f090: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
f0a0: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
f0b0: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
f0c0: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
f0d0: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
f0e0: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
f0f0: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
f100: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
f110: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
f120: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75   the remainder u
f130: 73 69 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d  sing a fresh mem
f140: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  ory allocation. 
f150: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
f160: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
f170: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
f180: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
f190: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
f1a0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
f1b0: 20 6d 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65   memory at the e
f1c0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
f1d0: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 63 61   array.  This ca
f1e0: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
f1f0: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
f200: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
f210: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
f220: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
f230: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78   */.  do {.    x
f240: 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  .nNeeded = 0;.  
f250: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
f260: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d  cSpace(&x, p->aM
f270: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
f280: 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Mem));.    p->aV
f290: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
f2a0: 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61  &x, p->aVar, nVa
f2b0: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  r*sizeof(Mem));.
f2c0: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
f2d0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
f2e0: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
f2f0: 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20  eof(Mem*));.    
f300: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
f310: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43  Space(&x, p->apC
f320: 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
f330: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
f340: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f350: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
f360: 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e  STATUS.    p->an
f370: 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
f380: 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c  e(&x, p->anExec,
f390: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
f3a0: 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  64));.#endif.   
f3b0: 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d   if( x.nNeeded==
f3c0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78  0 ) break;.    x
f3d0: 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72  .pSpace = p->pFr
f3e0: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
f3f0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e  llocRawNN(db, x.
f400: 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e  nNeeded);.    x.
f410: 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65  nFree = x.nNeede
f420: 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62  d;.  }while( !db
f430: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f440: 3b 0a 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d  ;..  p->pVList =
f450: 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b   pParse->pVList;
f460: 0a 20 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73  .  pParse->pVLis
f470: 74 20 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70  t =  0;.  p->exp
f480: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
f490: 78 70 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62  xplain;.  if( db
f4a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f4b0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
f4c0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f  0;.    p->nCurso
f4d0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d  r = 0;.    p->nM
f4e0: 65 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  em = 0;.  }else{
f4f0: 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
f500: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  = nCursor;.    p
f510: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
f520: 6e 56 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65  nVar;.    initMe
f530: 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
f540: 6e 56 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  nVar, db, MEM_Nu
f550: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  ll);.    p->nMem
f560: 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69   = nMem;.    ini
f570: 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  tMemArray(p->aMe
f580: 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d  m, nMem, db, MEM
f590: 5f 55 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20  _Undefined);.   
f5a0: 20 6d 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72   memset(p->apCsr
f5b0: 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  , 0, nCursor*siz
f5c0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
f5d0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f5e0: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
f5f0: 4e 53 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73  NSTATUS.    mems
f600: 65 74 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c  et(p->anExec, 0,
f610: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
f620: 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  64));.#endif.  }
f630: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
f640: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
f650: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
f660: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
f670: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
f680: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
f690: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
f6a0: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
f6b0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
f6c0: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
f6d0: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
f6e0: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
f6f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
f700: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
f710: 78 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75  x==0 || pCx->eCu
f720: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
f730: 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68  TREE );.  switch
f740: 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20  ( pCx->eCurType 
f750: 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  ){.    case CURT
f760: 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20  YPE_SORTER: {.  
f770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
f780: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
f790: 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72  , pCx);.      br
f7a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f7b0: 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45  ase CURTYPE_BTRE
f7c0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
f7d0: 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20  Cx->isEphemeral 
f7e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
f7f0: 43 78 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74  Cx->pBtx ) sqlit
f800: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
f810: 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20  ->pBtx);.       
f820: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
f830: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
f840: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
f850: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
f860: 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  by.        ** th
f870: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
f880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
f8a0: 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  x->uc.pCursor!=0
f8b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
f8c0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
f8d0: 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72  sor(pCx->uc.pCur
f8e0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
f8f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f910: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f920: 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  E.    case CURTY
f930: 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  PE_VTAB: {.     
f940: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
f950: 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43  rsor *pVCur = pC
f960: 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20  x->uc.pVCur;.   
f970: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
f980: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
f990: 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d   = pVCur->pVtab-
f9a0: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20  >pModule;.      
f9b0: 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70  assert( pVCur->p
f9c0: 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Vtab->nRef>0 );.
f9d0: 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74        pVCur->pVt
f9e0: 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ab->nRef--;.    
f9f0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
fa00: 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20  e(pVCur);.      
fa10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
fa20: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
fa30: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
fa40: 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  rs in the curren
fa50: 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  t frame..*/.stat
fa60: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72  ic void closeCur
fa70: 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65  sorsInFrame(Vdbe
fa80: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
fa90: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
faa0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
fab0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
fac0: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
fad0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
fae0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
faf0: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
fb00: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
fb10: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
fb20: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
fb30: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
fb40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
fb50: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
fb60: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
fb70: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
fb80: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
fb90: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
fba0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
fbb0: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
fbc0: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
fbd0: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
fbe0: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
fbf0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
fc00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
fc10: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
fc20: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
fc30: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
fc40: 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65  rame->v;.  close
fc50: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76  CursorsInFrame(v
fc60: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
fc70: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
fc80: 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45  NSTATUS.  v->anE
fc90: 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e  xec = pFrame->an
fca0: 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76  Exec;.#endif.  v
fcb0: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
fcc0: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
fcd0: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
fce0: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
fcf0: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
fd00: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
fd10: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
fd20: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
fd30: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
fd40: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
fd50: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
fd60: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
fd70: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
fd80: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
fd90: 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43  nge;.  v->db->nC
fda0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
fdb0: 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c  nDbChange;.  sql
fdc0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
fdd0: 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d  xData(v->db, &v-
fde0: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
fdf0: 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61  );.  v->pAuxData
fe00: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44   = pFrame->pAuxD
fe10: 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70  ata;.  pFrame->p
fe20: 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72  AuxData = 0;.  r
fe30: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
fe40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
fe50: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
fe60: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
fe70: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
fe80: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
fe90: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
fea0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
feb0: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
fec0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
fed0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
fee0: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
fef0: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
ff00: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
ff10: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
ff20: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
ff30: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
ff40: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
ff50: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
ff60: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
ff70: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
ff80: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
ff90: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
ffa0: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
ffb0: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
ffc0: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
ffd0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
ffe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fff0: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
10000 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
10010 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
10020 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
10030 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
10040 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f  rame==0 );.  clo
10050 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
10060 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
10070 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
10080 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
10090 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  m, p->nMem);.  }
100a0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
100b0 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
100c0 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
100d0 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
100e0 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
100f0 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
10100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
10110 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
10120 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
10130 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
10140 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
10150 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
10160 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
10170 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10180 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c  teAuxData(p->db,
10190 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &p->pAuxData, -
101a0 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
101b0 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
101c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
101d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
101e0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
101f0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
10200 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
10210 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
10220 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
10230 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
10240 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
10250 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
10260 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
10270 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
10280 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
10290 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
102a0 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
102b0 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
102c0 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
102d0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
102e0 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
102f0 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
10300 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  mn){.  int n;.  
10310 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
10320 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  >db;..  if( p->n
10330 52 65 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ResColumn ){.   
10340 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
10350 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
10360 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
10370 41 4d 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69  AME_N);.    sqli
10380 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
10390 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a  >aColName);.  }.
103a0 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
103b0 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
103c0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
103d0 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
103e0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28   p->aColName = (
103f0 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
10400 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
10410 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
10420 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
10430 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10440 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10450 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c  aColName, n, db,
10460 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f   MEM_Null);.}../
10470 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
10480 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
10490 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
104a0 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
104b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
104c0 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
104d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
104e0 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
104f0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
10500 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
10510 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
10520 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
10530 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
10540 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
10550 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
10560 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
10570 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
10580 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
10590 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
105a0 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
105b0 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
105c0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
105d0 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
105e0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
105f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
10600 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
10610 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
10620 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
10630 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
10640 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10660 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
10670 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
10680 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
10690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
106a0 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
106b0 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
106c0 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
106f0 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
10700 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
10710 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10730 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
10740 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
10750 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
10760 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
10770 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
10780 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
10790 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
107a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
107b0 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
107c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
107d0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
107e0 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
107f0 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
10800 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
10810 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
10820 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
10830 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
10840 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
10850 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
10860 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
10870 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
10880 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
10890 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
108a0 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
108b0 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
108c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
108d0 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
108e0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
108f0 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
10900 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
10910 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
10920 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
10930 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
10940 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10950 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
10960 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
10970 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
10980 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
10990 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
109a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
109b0 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
109c0 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
109d0 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
109e0 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
109f0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
10a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
10a10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10a20 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
10a30 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10a40 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
10a50 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
10a60 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
10a70 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
10a80 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
10a90 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
10aa0 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
10ab0 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
10ac0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63     ** that are c
10af0 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61 20  andidates for a 
10b00 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
10b10 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20   using a.       
10b20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d              ** m
10b30 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  aster-journal */
10b40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10b50 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
10b60 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
10b70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10b80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10b90 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
10ba0 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
10bb0 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
10bc0 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
10bd0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
10be0 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
10bf0 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
10c00 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
10c10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
10c20 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
10c30 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
10c40 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
10c50 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
10c60 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
10c70 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
10c80 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
10c90 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
10ca0 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
10cb0 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
10cc0 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
10cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
10ce0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
10cf0 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
10d00 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
10d10 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
10d20 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
10d30 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
10d40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10d50 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
10d60 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
10d70 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
10d80 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
10d90 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
10da0 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
10db0 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
10dc0 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
10dd0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
10de0 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
10df0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
10e00 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
10e10 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
10e20 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
10e30 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
10e40 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
10e50 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
10e60 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
10e70 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
10e80 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
10e90 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
10ea0 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
10eb0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
10ec0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
10ed0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10ee0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10ef0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10f00 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10f10 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
10f20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ){.      /* Whet
10f30 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74  her or not a dat
10f40 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64  abase might need
10f50 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10f60 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20  l depends upon. 
10f70 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72       ** its jour
10f80 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20  nal mode (among 
10f90 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20  other things).  
10fa0 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74 65  This matrix dete
10fb0 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20  rmines which.   
10fc0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f     ** journal mo
10fd0 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65 72  des use a master
10fe0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69   journal and whi
10ff0 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20  ch do not */.   
11000 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
11010 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d  u8 aMJNeeded[] =
11020 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45   {.        /* DE
11030 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20  LETE   */  1,.  
11040 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54        /* PERSIST
11050 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20     */ 1,.       
11060 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f   /* OFF       */
11070 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0,.        /* T
11080 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20  RUNCATE  */ 1,. 
11090 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59         /* MEMORY
110a0 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
110b0 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a    /* WAL       *
110c0 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  / 0.      };.   
110d0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
110e0 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73  ;   /* Pager ass
110f0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
11100 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63   */.      needXc
11110 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
11120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11130 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  er(pBt);.      p
11140 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
11150 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
11160 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44        if( db->aD
11170 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[i].safety_leve
11180 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l!=PAGER_SYNCHRO
11190 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20  NOUS_OFF.       
111a0 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c  && aMJNeeded[sql
111b0 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72  ite3PagerGetJour
111c0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d  nalMode(pPager)]
111d0 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20  .      ){ .     
111e0 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20     assert( i!=1 
111f0 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e  );.        nTran
11200 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s++;.      }.   
11210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11220 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
11230 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11240 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11250 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
11260 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
11270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
11280 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
11290 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
112a0 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
112b0 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
112c0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
112d0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
112e0 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
112f0 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
11300 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
11310 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
11320 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
11330 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
11340 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11350 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11360 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
11370 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
11380 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
11390 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
113a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
113b0 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
113c0 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
113d0 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
113e0 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
113f0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
11400 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
11410 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
11420 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
11430 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
11440 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11450 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
11460 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
11470 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
11480 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11490 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
114a0 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
114b0 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
114c0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
114d0 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
114e0 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
114f0 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
11500 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
11510 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
11520 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
11530 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
11540 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
11550 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
11560 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
11570 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11590 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
115a0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
115b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
115c0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
115d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
115e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
115f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
11600 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11610 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
11620 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
11630 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
11640 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
11650 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
11660 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
11670 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
11680 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
11690 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
116a0 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
116b0 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
116c0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
116d0 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
116e0 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
116f0 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
11700 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
11710 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
11720 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
11730 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
11740 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
11750 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11760 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11770 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11780 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11790 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
117a0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
117b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
117c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
117d0 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
117e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
117f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11810 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
11820 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
11830 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
11840 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
11850 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
11860 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
11870 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
11880 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
11890 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
118a0 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
118b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
118c0 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
118d0 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
118e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
118f0 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
11900 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
11910 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
11920 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
11930 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
11940 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
11950 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
11960 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
11970 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
11980 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
11990 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
119a0 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
119b0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
119c0 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
119d0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
119e0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
119f0 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
11a00 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
11a10 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
11a20 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11a30 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
11a40 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
11a50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11a60 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
11a70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11a80 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
11a90 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
11aa0 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
11ab0 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
11ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11ad0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f  MEM_BKPT;.    do
11ae0 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
11af0 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
11b00 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
11b10 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
11b20 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
11b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
11b40 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
11b50 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
11b60 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11b70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
11b80 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11b90 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
11ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11bb0 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
11bc0 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
11bd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
11be0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
11bf0 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
11c00 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11c10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11c20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
11c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
11c40 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
11c50 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
11c60 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
11c70 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
11c80 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
11c90 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
11ca0 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
11cd0 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
11ce0 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
11cf0 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
11d00 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
11d10 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
11d20 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
11d30 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
11d40 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
11d50 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
11d60 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
11d70 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
11d80 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
11d90 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
11da0 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
11db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
11dc0 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
11dd0 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
11de0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11df0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
11e00 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
11e10 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
11e20 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
11e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11e40 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
11e50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11e60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
11e70 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11e80 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
11e90 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
11ea0 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
11eb0 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
11ec0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11ed0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11ee0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
11ef0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
11f00 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11f10 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
11f20 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
11f30 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
11f40 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
11f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11f60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11f70 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11f80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11f90 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
11fa0 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
11fb0 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
11fc0 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
11fd0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
11fe0 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
11ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
12000 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12010 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
12020 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
12030 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
12040 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
12050 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
12060 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
12070 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
12080 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
12090 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
120a0 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
120b0 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
120c0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
120d0 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
120e0 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
120f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12100 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
12110 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12120 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12130 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
12140 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
12150 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
12160 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
12170 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
12180 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
12190 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
121a0 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
121b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
121c0 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
121d0 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
121e0 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
121f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
12200 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
12210 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
12220 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
12230 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
12240 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
12250 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
12260 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
12270 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
12280 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
12290 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
122a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
122b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
122c0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
122d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
122e0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
122f0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
12300 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12310 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
12320 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
12330 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12350 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
12360 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
12370 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
12380 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
12390 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
123a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
123b0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
123c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
123d0 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  ( 0==(sqlite3OsD
123e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
123f0 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
12400 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
12410 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
12420 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
12430 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
12440 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
12450 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
12460 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12470 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
12480 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
12490 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
124a0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
124b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
124c0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
124d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
124e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
124f0 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
12500 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
12510 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
12520 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
12530 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
12540 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12550 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
12560 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12570 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
12580 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
12590 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
125a0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
125b0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
125c0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
125d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
125e0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
125f0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
12600 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12610 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
12620 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
12630 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
12640 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
12650 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
12660 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
12670 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
12680 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
12690 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
126a0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
126b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
126c0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
126d0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
126e0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
126f0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
12700 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12710 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
12720 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12730 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
12740 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
12750 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
12760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12770 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12780 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
12790 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
127a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
127b0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
127c0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
127d0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
127e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
127f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12800 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12810 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
12820 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12830 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
12840 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
12850 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
12860 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
12870 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
12880 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
12890 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
128a0 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
128b0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
128c0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
128d0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
128e0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
128f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
12900 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
12910 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
12920 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12930 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
12940 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
12950 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12970 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
12980 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
12990 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
129a0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
129b0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
129c0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
129d0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
129e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
129f0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
12a00 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
12a10 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
12a20 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
12a30 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
12a40 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
12a50 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
12a60 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
12a70 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
12a80 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
12a90 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
12aa0 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
12ab0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
12ac0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
12ad0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
12ae0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
12af0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
12b00 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
12b10 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
12b20 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
12b30 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
12b40 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
12b50 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
12b60 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12b70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12b80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
12b90 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12ba0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
12bc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12bd0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12be0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
12bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12c00 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
12c10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
12c20 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
12c30 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
12c40 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
12c50 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
12c60 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
12c70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
12c80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
12c90 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
12ca0 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
12cb0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
12cc0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
12cd0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
12ce0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
12cf0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
12d00 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
12d10 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
12d20 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
12d30 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
12d40 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
12d50 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
12d60 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
12d70 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
12d80 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
12d90 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
12da0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
12db0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
12dc0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
12dd0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
12de0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
12df0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
12e00 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
12e10 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
12e20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
12e30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
12e40 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
12e50 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
12e60 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12e70 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
12e80 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
12e90 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
12ea0 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
12eb0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
12ec0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
12ed0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
12ee0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
12ef0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12f00 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
12f10 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12f20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
12f30 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
12f40 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
12f50 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
12f60 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
12f70 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
12f80 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
12f90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
12fa0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
12fb0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
12fc0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
12fd0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
12fe0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
12ff0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
13000 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
13010 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
13020 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
13030 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
13040 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
13050 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
13060 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
13070 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
13080 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
13090 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
130a0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
130b0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
130c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
130d0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
130e0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
130f0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
13100 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
13110 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13120 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
13130 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
13140 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
13150 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
13160 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
13170 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
13180 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
13190 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
131a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
131b0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
131c0 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
131d0 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
131e0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72  ment-1;..  asser
131f0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
13200 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
13210 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
13220 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28  EASE);.  assert(
13230 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
13240 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13250 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
13260 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
13270 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
13280 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
13290 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
132a0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
132b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65  ITE_OK;.    Btre
132c0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
132d0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
132e0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66   pBt ){.      if
132f0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
13300 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
13310 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13320 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
13330 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
13340 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
13350 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
13360 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
13370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13380 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13390 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
133a0 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
133b0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
133c0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
133d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
133e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
133f0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
13400 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
13410 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
13420 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
13430 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
13440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13450 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13460 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13480 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
13490 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
134a0 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
134b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
134c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
134d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
134e0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
134f0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
13500 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
13510 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oint);.    }.  }
13520 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
13530 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13540 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
13550 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
13560 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  estore the .  **
13570 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13580 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
13590 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
135a0 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
135b0 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d when .  ** the
135c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
135d0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
135e0 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70  d.  */.  if( eOp
135f0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
13600 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  BACK ){.    db->
13610 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
13620 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
13630 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
13640 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
13650 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
13660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13670 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
13680 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13690 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
136a0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  p){.  if( p->db-
136b0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
136c0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
136d0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
136e0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
136f0 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74   eOp);.  }.  ret
13700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13710 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
13720 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13730 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
13740 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
13750 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
13760 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
13770 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
13780 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
13790 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
137a0 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
137b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
137c0 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
137d0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
137e0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
137f0 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
13800 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
13810 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
13820 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
13830 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
13840 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
13850 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13860 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
13870 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
13880 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13890 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
138a0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
138b0 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
138c0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
138d0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
138e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
138f0 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
13900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
13910 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
13920 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
13930 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
13940 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
13950 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
13960 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
13970 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
13980 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
13990 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
139a0 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
139b0 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
139c0 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
139d0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
139e0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
139f0 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
13a00 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
13a10 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
13a20 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
13a30 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
13a40 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
13a50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13a90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13aa0 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
13ab0 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
13ac0 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
13ad0 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
13ae0 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
13af0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
13b00 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
13b10 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
13b20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
13b30 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
13b40 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
13b50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13b60 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
13b70 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
13b80 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
13b90 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
13ba0 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
13bb0 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
13bc0 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
13bd0 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
13be0 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
13bf0 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
13c00 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
13c10 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
13c20 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
13c30 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
13c40 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
13c50 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
13c60 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
13c70 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
13c80 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13c90 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
13ca0 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
13cb0 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
13cc0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
13cd0 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
13ce0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
13cf0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
13d00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13d20 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
13d30 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
13d40 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
13d50 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
13d60 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
13d70 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
13d80 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
13d90 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
13da0 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
13db0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
13dc0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
13dd0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
13de0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
13df0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
13e00 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
13e10 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
13e20 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
13e30 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
13e40 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
13e50 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
13e60 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
13e70 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
13e80 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
13e90 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
13ea0 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
13eb0 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
13ec0 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
13ed0 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
13ee0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
13ef0 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
13f00 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
13f10 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
13f20 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
13f30 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
13f40 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
13f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
13f60 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
13f70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13f80 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
13f90 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
13fa0 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
13fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13fc0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
13fd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13fe0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13ff0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
14000 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
14010 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
14020 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
14030 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
14040 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
14050 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
14060 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
14070 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
14080 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
14090 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
140a0 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
140b0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
140c0 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
140d0 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
140e0 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
140f0 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
14100 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
14110 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
14120 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
14130 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
14140 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14150 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
14160 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
14170 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
14180 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
14190 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
141a0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
141b0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
141c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
141d0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
141e0 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
141f0 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
14200 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
14210 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
14220 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
14230 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
14240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14250 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
14260 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
14270 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
14280 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
14290 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
142a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
142b0 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
142c0 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
142d0 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
142e0 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
142f0 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
14300 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
14310 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
14320 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
14330 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
14340 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
14350 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
14360 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
14370 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
14380 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
14390 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
143a0 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
143b0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
143c0 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
143d0 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
143e0 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
143f0 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
14400 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
14410 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
14420 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
14430 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
14440 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
14450 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
14460 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
14470 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
14480 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
14490 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
144a0 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
144b0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
144c0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
144d0 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
144e0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
144f0 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
14500 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
14510 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
14520 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
14530 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
14540 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
14550 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
14560 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
14570 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
14580 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
14590 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
145a0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
145b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
145c0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
145d0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
145e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
145f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
14600 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
14610 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
14620 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
14630 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
14640 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
14650 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
14660 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
14670 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
14680 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
14690 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
146a0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
146b0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
146c0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
146d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
146e0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
146f0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
14700 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14710 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
14720 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14740 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
14750 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
14760 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
14770 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
14780 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
147a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
147b0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
147c0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
147d0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
147e0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
147f0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
14800 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
14810 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
14820 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
14830 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
14840 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
14850 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
14860 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
14870 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
14880 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
14890 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
148a0 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
148b0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
148c0 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
148d0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
148e0 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
148f0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
14900 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
14910 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
14920 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
14930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
14940 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14950 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
14960 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
14970 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
14980 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
14990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
149a0 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
149b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
149c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
149d0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
149e0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
149f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14a00 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14a10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14a20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14a30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14a40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14a50 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
14a60 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
14a70 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
14a80 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
14a90 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
14aa0 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
14ab0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
14ac0 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
14ad0 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
14ae0 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
14af0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
14b00 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
14b10 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
14b20 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
14b30 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
14b40 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
14b50 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
14b60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
14b70 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
14b80 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
14b90 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
14ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14bb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14bc0 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
14bd0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
14be0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
14bf0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
14c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14c10 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
14c20 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
14c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
14c40 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
14c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14c60 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14c70 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
14c80 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14c90 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
14ca0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
14cb0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
14cd0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
14ce0 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
14cf0 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
14d00 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
14d10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14d20 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
14d30 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
14d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
14d50 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14d60 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
14d70 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
14d80 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14d90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14da0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
14db0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
14dc0 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
14dd0 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
14de0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14df0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
14e00 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
14e10 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
14e20 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
14e30 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
14e40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
14e50 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14e60 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
14e70 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
14e80 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14e90 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
14ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14eb0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14ec0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14ed0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14ee0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14ef0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14f00 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14f10 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14f20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14f40 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
14f50 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
14f60 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
14f70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
14f80 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
14f90 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
14fa0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
14fb0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
14fc0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
14fd0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
14fe0 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
14ff0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
15000 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
15010 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
15020 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
15030 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
15040 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
15050 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
15060 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
15070 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
15080 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
15090 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
150a0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
150b0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
150c0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
150d0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
150e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
150f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
15100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
15110 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51  (p->rc&0xff)==SQ
15120 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
15130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15140 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
15150 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15160 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
15170 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
15180 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
15190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
151a0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
151b0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
151c0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
151d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
151e0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
151f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
15200 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
15210 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
15220 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15230 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
15240 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
15250 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
15260 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
15270 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
15280 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
15290 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
152a0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
152b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
152c0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
152d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
152e0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
152f0 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
15300 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
15310 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
15320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15330 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
15340 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
15350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15360 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
15370 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
15380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
15390 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
153a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
153b0 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f  ase the locks */
153c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
153d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20  Leave(p);.  }.. 
153e0 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
153f0 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
15400 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
15410 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
15420 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
15430 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
15440 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d  b->nVdbeActive--
15450 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
15460 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64  adOnly ) db->nVd
15470 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69  beWrite--;.    i
15480 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
15490 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d  ) db->nVdbeRead-
154a0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  -;.    assert( d
154b0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d  b->nVdbeActive>=
154c0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
154d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
154e0 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e  >nVdbeRead>=db->
154f0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
15500 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
15510 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20  dbeWrite>=0 );. 
15520 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
15530 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b  VDBE_MAGIC_HALT;
15540 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
15550 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28  beCnt(db);.  if(
15560 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15570 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
15580 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15590 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
155a0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
155b0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
155c0 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
155d0 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
155e0 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
155f0 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
15600 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
15610 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
15620 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
15630 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
15640 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
15650 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
15660 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
15670 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
15680 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
15690 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
156a0 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
156b0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
156c0 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
156d0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
156e0 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
156f0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
15700 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
15710 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
15720 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
15730 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
15740 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
15750 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
15760 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
15770 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
15780 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
15790 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
157a0 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
157b0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
157c0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
157d0 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
157e0 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
157f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
15800 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
15810 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
15820 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
15830 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
15840 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
15850 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15860 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
15870 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
15880 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
15890 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
158a0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
158b0 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
158c0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
158d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
158e0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
158f0 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
15900 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
15910 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
15920 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
15930 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
15940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15950 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
15960 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
15970 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
15980 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
15990 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
159a0 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  Msg ){.    db->b
159b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a  BenignMalloc++;.
159c0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
159d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
159e0 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72      if( db->pErr
159f0 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d  ==0 ) db->pErr =
15a00 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
15a10 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
15a20 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
15a30 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
15a40 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
15a50 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
15a60 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
15a70 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15a80 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65  c();.    db->bBe
15a90 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20  nignMalloc--;.  
15aa0 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 70 45  }else if( db->pE
15ab0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
15ac0 33 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62  3ValueSetNull(db
15ad0 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64  ->pErr);.  }.  d
15ae0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
15af0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15b00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15b10 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
15b20 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
15b30 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
15b40 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
15b50 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
15b60 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
15b70 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
15b80 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
15b90 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
15ba0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
15bb0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
15bc0 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
15bd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
15be0 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
15bf0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
15c00 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
15c10 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
15c20 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
15c30 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
15c40 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
15c50 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
15c60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15c70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
15c80 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
15c90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15ca0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
15cb0 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
15cc0 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
15cd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15ce0 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
15cf0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
15d00 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
15d10 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
15d20 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
15d30 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
15d40 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
15d50 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
15d60 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
15d70 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
15d80 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
15d90 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
15da0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
15db0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
15dc0 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
15dd0 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
15de0 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
15df0 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
15e00 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
15e10 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
15e20 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
15e30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
15e40 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
15e50 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
15e60 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
15e70 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
15e80 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
15e90 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
15ea0 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
15eb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
15ec0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
15ed0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
15ee0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
15ef0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
15f00 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
15f10 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
15f20 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
15f30 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
15f40 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
15f50 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
15f60 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
15f70 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
15f80 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
15f90 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
15fa0 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
15fb0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
15fc0 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
15fd0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
15fe0 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
15ff0 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
16000 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
16010 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
16020 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
16030 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
16040 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
16050 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
16060 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
16070 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
16080 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
16090 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
160a0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
160b0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
160c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
160d0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
160e0 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
160f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16100 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
16110 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  p);.    if( p->r
16120 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
16130 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
16140 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
16150 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
16160 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
16170 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
16180 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
16190 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
161a0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
161b0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
161c0 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
161d0 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
161e0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
161f0 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
16200 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
16210 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
16220 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
16230 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
16240 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
16250 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
16260 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
16270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
16280 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
16290 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20 65  ts and reclaim e
162a0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65 6d  rror message mem
162b0 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ory..  */.#ifdef
162c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
162d0 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
162e0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
162f0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
16300 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
16310 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
16320 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
16330 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
16340 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
16350 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
16360 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
16370 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
16380 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
16390 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
163a0 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
163b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
163c0 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
163d0 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
163e0 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69  lags==MEM_Undefi
163f0 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ned );.  }.#endi
16400 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
16410 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
16420 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
16430 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
16440 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  tSet = 0;..  /* 
16450 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
16460 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
16470 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
16480 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
16490 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
164a0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
164b0 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
164c0 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
164d0 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
164e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
164f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
16500 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
16510 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
16520 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
16530 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
16540 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
16550 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16560 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
16570 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
16580 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
16590 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
165a0 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
165b0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
165c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
165d0 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
165e0 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
165f0 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
16600 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
16610 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
16620 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
16630 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
16640 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
16650 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
16660 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
16670 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
16680 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16690 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
166a0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
166b0 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
166c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
166d0 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
166e0 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
166f0 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
16700 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
16710 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
16720 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
16730 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
16740 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
16750 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
16760 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
16770 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
16780 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16790 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
167a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
167b0 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
167c0 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
167d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
167e0 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
167f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
16800 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
16810 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72  C_RESET;.  retur
16820 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
16830 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
16840 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
16850 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
16860 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
16870 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
16880 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
16890 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
168a0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
168b0 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
168c0 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
168d0 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
168e0 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
168f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16900 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
16910 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
16920 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
16930 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
16940 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
16950 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
16960 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
16970 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
16980 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
16990 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
169a0 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
169b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
169c0 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
169d0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
169e0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
169f0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
16a00 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
16a10 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
16a20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
16a30 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
16a40 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
16a50 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
16a60 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
16a70 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
16a80 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
16a90 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
16aa0 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
16ab0 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
16ac0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
16ad0 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
16ae0 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
16af0 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
16b00 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
16b10 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
16b20 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
16b30 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
16b40 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
16b50 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
16b60 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
16b70 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
16b80 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
16b90 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
16ba0 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
16bb0 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
16bc0 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
16bd0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
16be0 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
16bf0 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
16c00 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
16c10 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
16c20 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
16c30 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
16c40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
16c50 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
16c60 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75  (sqlite3 *db, Au
16c70 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20  xData **pp, int 
16c80 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
16c90 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
16ca0 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
16cb0 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
16cc0 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
16cd0 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d   (pAux->iAuxOp==
16ce0 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20 26 26  iOp.          &&
16cf0 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d   pAux->iAuxArg>=
16d00 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
16d10 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 33 31  pAux->iAuxArg>31
16d20 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
16d30 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 75  KBIT32(pAux->iAu
16d40 78 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  xArg)))).    ){.
16d50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16d60 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33  pAux->iAuxArg==3
16d70 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
16d80 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 20  Aux->xDeleteAux 
16d90 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
16da0 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41 75 78  >xDeleteAux(pAux
16db0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
16dc0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
16dd0 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
16de0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16df0 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  (db, pAux);.    
16e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
16e10 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78   &pAux->pNextAux
16e20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16e30 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
16e40 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
16e50 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
16e60 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
16e70 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
16e80 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
16e90 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
16ea0 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
16eb0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
16ec0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
16ed0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
16ee0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
16ef0 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
16f00 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
16f10 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
16f20 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
16f30 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
16f40 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
16f50 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
16f60 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
16f70 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
16f80 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
16f90 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
16fa0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
16fb0 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
16fc0 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
16fd0 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
16fe0 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
16ff0 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
17000 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
17010 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
17020 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
17030 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
17040 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
17050 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
17060 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
17070 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
17080 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
17090 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
170a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
170b0 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
170c0 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
170d0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b  BE_MAGIC_INIT ){
170e0 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
170f0 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
17100 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  >nVar);.    sqli
17110 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
17120 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pVList);.    sq
17130 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17140 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  p->pFree);.  }. 
17150 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
17160 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
17170 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
17180 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
17190 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
171a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
171b0 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Sql);.#ifdef SQL
171c0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
171d0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20  SCANSTATUS.  {. 
171e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
171f0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61  r(i=0; i<p->nSca
17200 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
17210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17220 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
17230 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
17240 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17250 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a   p->aScan);.  }.
17260 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
17270 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
17280 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
17290 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
172a0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
172b0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
172c0 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
172d0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
172e0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
172f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17300 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
17310 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
17320 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
17330 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
17340 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
17350 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
17360 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
17370 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
17380 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
17390 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
173a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
173b0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
173c0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
173d0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
173e0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
173f0 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
17400 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
17410 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
17420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
17430 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70  rsor "p" has a p
17440 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72  ending seek oper
17450 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ation that has n
17460 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63  ot yet been.** c
17470 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65  arried out.  See
17480 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77  k the cursor now
17490 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
174a0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
174b0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
174c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
174d0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
174e0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
174f0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17500 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
17510 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
17520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17530 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  T.  extern int s
17540 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
17550 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  unt;.#endif.  as
17560 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65  sert( p->deferre
17570 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73  dMoveto );.  ass
17580 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
17590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
175a0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
175b0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20  E_BTREE );.  rc 
175c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
175d0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
175e0 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  uc.pCursor, 0, p
175f0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
17600 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20  0, &res);.  if( 
17610 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17620 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72    if( res!=0 ) r
17630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17640 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65  RUPT_BKPT;.#ifde
17650 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
17660 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
17670 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
17680 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
17690 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  to = 0;.  p->cac
176a0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
176b0 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e  _STALE;.  return
176c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
176d0 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68  *.** Something h
176e0 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20  as moved cursor 
176f0 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65  "p" out of place
17700 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77  .  Maybe the row
17710 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74   it was.** point
17720 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65  ed to was delete
17730 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
17740 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74   it.  Or maybe t
17750 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20  he btree was.** 
17760 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61  rebalanced.  Wha
17770 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c  tever the cause,
17780 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20   try to restore 
17790 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65  "p" to the place
177a0 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73   it.** is suppos
177b0 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e  ed to be pointin
177c0 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77  g.  If the row w
177d0 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  as deleted out f
177e0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a  rom under the.**
177f0 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65   cursor, set the
17800 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
17810 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a   to a NULL row..
17820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17830 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
17840 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
17850 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
17860 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e    int isDifferen
17870 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65  tRow, rc;.  asse
17880 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
17890 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
178a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75  ;.  assert( p->u
178b0 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
178c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
178d0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
178e0 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
178f0 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  or) );.  rc = sq
17900 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17910 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43  Restore(p->uc.pC
17920 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72  ursor, &isDiffer
17930 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61  entRow);.  p->ca
17940 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
17950 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69  E_STALE;.  if( i
17960 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20  sDifferentRow ) 
17970 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
17980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17990 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65  /*.** Check to e
179a0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
179b0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
179c0 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
179d0 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62  sor.** if need b
179e0 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49  e.  Return any I
179f0 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  /O error from th
17a00 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74  e restore operat
17a10 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
17a20 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
17a30 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20  tore(VdbeCursor 
17a40 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
17a50 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
17a60 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69  YPE_BTREE );.  i
17a70 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
17a80 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
17a90 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a  >uc.pCursor) ){.
17aa0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
17ab0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
17ac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17ad0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17ae0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
17af0 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
17b00 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
17b10 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
17b20 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
17b30 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
17b40 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
17b50 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
17b60 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
17b70 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
17b80 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
17b90 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
17ba0 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
17bb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
17bc0 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
17bd0 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
17be0 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
17bf0 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
17c00 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
17c10 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
17c20 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
17c30 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
17c40 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
17c50 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
17c60 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
17c70 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
17c80 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
17c90 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
17ca0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
17cb0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
17cc0 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
17cd0 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
17ce0 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
17cf0 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
17d00 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
17d10 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
17d20 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17d30 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
17d40 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
17d50 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70  o(VdbeCursor **p
17d60 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a  p, int *piCol){.
17d70 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20    VdbeCursor *p 
17d80 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74 28  = *pp;.  assert(
17d90 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
17da0 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70  RTYPE_BTREE || p
17db0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
17dc0 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20  YPE_PSEUDO );.  
17dd0 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
17de0 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74  oveto ){.    int
17df0 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70   iMap;.    if( p
17e00 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d  ->aAltMap && (iM
17e10 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b  ap = p->aAltMap[
17e20 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a  1+*piCol])>0 ){.
17e30 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
17e40 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  AltCursor;.     
17e50 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d   *piCol = iMap -
17e60 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
17e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17e80 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  }.    return han
17e90 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
17ea0 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  o(p);.  }.  if( 
17eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17ec0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
17ed0 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
17ee0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
17ef0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
17f00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17f10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17f20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
17f30 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
17f40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17f50 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
17f60 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
17f70 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17f80 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
17f90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17fa0 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
17fb0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17fc0 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
17fd0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
17fe0 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
17ff0 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
18000 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
18010 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
18020 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
18030 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
18040 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
18050 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
18060 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
18070 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
18080 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
18090 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
180a0 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
180b0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
180c0 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
180d0 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
180e0 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
180f0 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
18100 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
18110 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
18120 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
18130 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
18140 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
18150 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
18160 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
18170 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
18180 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
18190 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
181a0 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
181b0 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
181c0 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
181d0 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
181e0 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
181f0 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
18200 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18210 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
18220 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
18230 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
18240 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
18250 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
18260 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
18270 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
18280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
18290 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
182a0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
182b0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
182e0 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18300 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
18310 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
18320 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
18330 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
18340 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
18350 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
18360 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
18370 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
18380 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
18390 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183b0 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
183c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
183d0 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
183e0 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
183f0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
18400 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
18430 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
18440 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
18460 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
18470 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18490 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
184a0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
184b0 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
184e0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
184f0 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
18520 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
18530 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
18540 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
18550 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
18560 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
18570 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
18580 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
18590 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
185a0 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
185b0 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
185c0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
185d0 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
185e0 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
185f0 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
18600 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
18610 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
18620 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
18630 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
18640 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
18650 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
18660 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18670 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
18680 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32  file_format, u32
18690 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66   *pLen){.  int f
186a0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
186b0 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
186c0 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20  assert( pLen!=0 
186d0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  );.  if( flags&M
186e0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a  EM_Null ){.    *
186f0 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65  pLen = 0;.    re
18700 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
18710 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
18720 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
18730 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
18740 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
18750 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
18760 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
18770 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
18780 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
18790 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
187a0 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
187b0 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
187c0 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20        u = ~i;.  
187d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
187e0 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
187f0 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
18800 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69      if( (i&1)==i
18810 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
18820 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =4 ){.        *p
18830 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Len = 0;.       
18840 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75   return 8+(u32)u
18850 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18860 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31         *pLen = 1
18870 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18880 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18890 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
188a0 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b  67 ){ *pLen = 2;
188b0 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20   return 2; }.   
188c0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
188d0 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65  ){ *pLen = 3; re
188e0 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66  turn 3; }.    if
188f0 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
18900 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65  ){ *pLen = 4; re
18910 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66  turn 4; }.    if
18920 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
18930 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74  { *pLen = 6; ret
18940 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c  urn 5; }.    *pL
18950 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
18960 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
18970 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
18980 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  {.    *pLen = 8;
18990 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
189a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
189b0 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
189c0 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
189d0 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
189e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
189f0 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
18a00 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
18a10 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
18a20 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
18a30 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
18a40 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e  .  }.  *pLen = n
18a50 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
18a60 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
18a70 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
18a80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
18a90 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
18aa0 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
18ab0 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  8.*/.static cons
18ac0 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c  t u8 sqlite3Smal
18ad0 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b  lTypeSizes[] = {
18ae0 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20  .        /*  0  
18af0 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20   1   2   3   4  
18b00 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20   5   6   7   8  
18b10 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20   9 */   ./*   0 
18b20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20  */   0,  1,  2, 
18b30 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20   3,  4,  6,  8, 
18b40 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20   8,  0,  0,./*  
18b50 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  10 */   0,  0,  
18b60 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
18b70 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f  2,  2,  3,  3,./
18b80 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34  *  20 */   4,  4
18b90 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36  ,  5,  5,  6,  6
18ba0 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38  ,  7,  7,  8,  8
18bb0 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c  ,./*  30 */   9,
18bc0 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c    9, 10, 10, 11,
18bd0 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c   11, 12, 12, 13,
18be0 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20   13,./*  40 */  
18bf0 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20  14, 14, 15, 15, 
18c00 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20  16, 16, 17, 17, 
18c10 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a  18, 18,./*  50 *
18c20 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32  /  19, 19, 20, 2
18c30 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32  0, 21, 21, 22, 2
18c40 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36  2, 23, 23,./*  6
18c50 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35  0 */  24, 24, 25
18c60 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37  , 25, 26, 26, 27
18c70 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a  , 27, 28, 28,./*
18c80 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c    70 */  29, 29,
18c90 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c   30, 30, 31, 31,
18ca0 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c   32, 32, 33, 33,
18cb0 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20  ./*  80 */  34, 
18cc0 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20  34, 35, 35, 36, 
18cd0 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20  36, 37, 37, 38, 
18ce0 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33  38,./*  90 */  3
18cf0 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34  9, 39, 40, 40, 4
18d00 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34  1, 41, 42, 42, 4
18d10 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f  3, 43,./* 100 */
18d20 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35    44, 44, 45, 45
18d30 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37  , 46, 46, 47, 47
18d40 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30  , 48, 48,./* 110
18d50 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c   */  49, 49, 50,
18d60 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c   50, 51, 51, 52,
18d70 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20   52, 53, 53,./* 
18d80 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20  120 */  54, 54, 
18d90 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20  55, 55, 56, 56, 
18da0 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  57, 57.};../*.**
18db0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
18dc0 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
18dd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
18de0 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
18df0 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
18e00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18e10 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
18e20 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
18e30 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
18e40 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  28 ){.    return
18e50 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
18e60 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
18e70 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
18e80 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20  _type<12 .      
18e90 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
18ea0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
18eb0 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65  erial_type]==(se
18ec0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f  rial_type - 12)/
18ed0 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 );.    return 
18ee0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18ef0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
18f00 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c  e];.  }.}.u8 sql
18f10 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
18f20 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20  erialTypeLen(u8 
18f30 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
18f40 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18f50 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74  ype<128 );.  ret
18f60 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
18f70 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18f80 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a  _type];  .}../*.
18f90 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
18fa0 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
18fb0 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
18fc0 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
18fd0 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
18fe0 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
18ff0 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
19000 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
19010 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
19020 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
19030 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
19040 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
19050 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
19060 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
19070 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
19080 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
19090 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
190a0 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
190b0 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
190c0 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
190d0 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
190e0 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
190f0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
19100 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
19110 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
19120 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
19130 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
19140 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
19150 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
19160 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
19170 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
19180 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
19190 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
191a0 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
191b0 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
191c0 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
191d0 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
191e0 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
191f0 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
19200 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
19210 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
19220 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
19230 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
19240 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
19250 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
19260 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
19270 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
19280 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
19290 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
192a0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
192b0 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
192c0 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
192d0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
192e0 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
192f0 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
19300 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
19310 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
19320 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
19330 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
19340 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
19350 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
19360 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
19370 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
19380 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
19390 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
193a0 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
193b0 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
193c0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
193d0 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
193e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
193f0 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
19400 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
19410 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
19420 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
19430 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
19440 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
19450 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
19460 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
19470 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
19480 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
19490 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
194a0 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
194b0 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
194c0 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
194d0 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
194e0 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
194f0 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
19500 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
19510 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
19520 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
19530 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
19540 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
19550 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
19560 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
19570 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
19580 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
19590 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
195a0 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
195b0 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
195c0 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
195d0 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
195e0 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
195f0 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
19600 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
19610 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
19620 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
19630 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
19640 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
19650 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
19660 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
19670 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
19680 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
19690 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
196a0 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
196b0 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
196c0 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
196d0 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
196e0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
196f0 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
19700 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
19710 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
19720 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
19730 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
19740 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
19750 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
19760 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
19770 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
19780 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
19790 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
197a0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
197b0 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
197c0 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
197d0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
197e0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
197f0 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
19800 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
19810 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
19820 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
19830 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
19840 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
19850 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
19860 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
19870 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
19880 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
19890 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
198a0 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
198b0 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
198c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
198d0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
198e0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
198f0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
19900 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
19910 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
19920 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
19930 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
19940 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
19950 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
19960 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
19970 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
19980 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
19990 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
199a0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
199b0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
199c0 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
199d0 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
199e0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
199f0 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
19a00 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
19a10 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
19a20 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
19a30 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
19a40 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19a50 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
19a60 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
19a70 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
19a80 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
19a90 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
19aa0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
19ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19ac0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
19ad0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
19ae0 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c   i = sqlite3Smal
19af0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
19b00 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73  l_type];.    ass
19b10 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
19b20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
19b30 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
19b40 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
19b50 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
19b60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
19b70 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
19b80 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
19b90 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
19ba0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
19bb0 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
19bc0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
19bd0 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
19be0 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
19bf0 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
19c00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
19c10 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
19c20 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
19c30 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66   pMem->n;.    if
19c40 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79  ( len>0 ) memcpy
19c50 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
19c60 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
19c70 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
19c80 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
19c90 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
19ca0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70  urn 0;.}../* Inp
19cb0 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75  ut "x" is a sequ
19cc0 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64  ence of unsigned
19cd0 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
19ce0 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20   represent a.** 
19cf0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19d00 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
19d10 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76  equivalent nativ
19d20 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65  e integer.*/.#de
19d30 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  fine ONE_BYTE_IN
19d40 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29  T(x)    ((i8)(x)
19d50 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f  [0]).#define TWO
19d60 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
19d70 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  (256*(i8)((x)[0]
19d80 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e  )|(x)[1]).#defin
19d90 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  e THREE_BYTE_INT
19da0 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29  (x)  (65536*(i8)
19db0 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
19dc0 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65  <<8)|(x)[2]).#de
19dd0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55  fine FOUR_BYTE_U
19de0 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28  INT(x)  (((u32)(
19df0 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b  x)[0]<<24)|((x)[
19e00 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
19e10 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66  <8)|(x)[3]).#def
19e20 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  ine FOUR_BYTE_IN
19e30 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28  T(x) (16777216*(
19e40 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
19e50 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
19e60 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
19e70 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
19e80 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
19e90 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
19ea0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
19eb0 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
19ec0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
19ed0 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
19ee0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19ef0 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a  f bytes read..**
19f00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19f10 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
19f20 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65   as two separate
19f30 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65   routines for pe
19f40 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
19f50 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74  e few cases that
19f60 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76   require local v
19f70 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f  ariables are bro
19f80 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73  ken out into a s
19f90 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69  eparate.** routi
19fa0 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f  ne so that in mo
19fb0 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65  st cases the ove
19fc0 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20  rhead of moving 
19fd0 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  the stack pointe
19fe0 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e  r.** is avoided.
19ff0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20  .*/ .static u32 
1a000 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1a010 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  serialGet(.  con
1a020 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a030 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1a040 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1a050 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1a060 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1a070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a080 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1a090 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1a0a0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a0c0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1a0d0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1a0e0 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20  */.){.  u64 x = 
1a0f0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1a100 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46  uf);.  u32 y = F
1a110 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
1a120 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c  f+4);.  x = (x<<
1a130 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73  32) + y;.  if( s
1a140 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
1a150 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1a160 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32  -OF: R-29851-522
1a170 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  72 Value is a bi
1a180 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a  g-endian 64-bit.
1a190 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1a1a0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1a1b0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  */.    pMem->u.i
1a1c0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
1a1d0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a1e0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73  MEM_Int;.    tes
1a1f0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a200 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  <0 );.  }else{. 
1a210 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a220 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34  F: R-57343-49114
1a230 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a240 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d  endian IEEE 754-
1a250 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20  2008 64-bit.    
1a260 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
1a270 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66  t number. */.#if
1a280 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1a290 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1a2a0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1a2b0 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a  NG_POINT).    /*
1a2c0 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
1a2d0 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
1a2e0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
1a2f0 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
1a300 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
1a310 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
1a320 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
1a330 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
1a340 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
1a350 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
1a360 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1a370 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
1a380 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e  d.    ** endian.
1a390 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
1a3a0 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
1a3b0 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
1a3c0 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61  00)<<32;.    sta
1a3d0 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
1a3e0 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75   r1 = 1.0;.    u
1a3f0 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
1a400 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
1a410 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73  loat(t2);.    as
1a420 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
1a430 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
1a440 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
1a450 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
1a460 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
1a470 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
1a480 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
1a490 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20  m->u.r)==8 );.  
1a4a0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1a4b0 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d  nFloat(x);.    m
1a4c0 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72  emcpy(&pMem->u.r
1a4d0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
1a4e0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
1a4f0 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
1a500 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45  (pMem->u.r) ? ME
1a510 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
1a520 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
1a530 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  8;.}.u32 sqlite3
1a540 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
1a550 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1a560 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
1a570 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
1a580 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
1a590 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1a5a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a5b0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
1a5c0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
1a5d0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
1a600 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
1a610 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
1a620 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1a630 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
1a640 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
1a650 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
1a660 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
1a670 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
1a680 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
1a690 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
1a6a0 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
1a6b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a6c0 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
1a6d0 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
1a6e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a6f0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
1a700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a710 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
1a720 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a730 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
1a740 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
1a750 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
1a760 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
1a770 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1a780 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
1a790 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a7a0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a7b0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a7c0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a7d0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a7e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1a7f0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1a800 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1a810 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1a820 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a830 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
1a840 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1a850 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
1a860 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1a870 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1a880 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a890 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
1a8a0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a8b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a8c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a8d0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a8e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1a8f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a900 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1a910 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a920 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a930 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
1a940 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
1a950 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
1a960 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1a970 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1a980 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a990 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
1a9a0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a9b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a9c0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a9d0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a9e0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a9f0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
1aa00 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1aa10 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1aa20 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1aa30 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1aa40 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
1aa50 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1aa60 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
1aa70 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1aa80 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1aa90 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1aaa0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
1aab0 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
1aac0 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
1aad0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
1aae0 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
1aaf0 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
1ab00 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
1ab10 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
1ab20 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
1ab30 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
1ab40 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
1ab50 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
1ab60 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1ab70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ab80 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1ab90 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
1aba0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1abb0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1abc0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1abd0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1abe0 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
1abf0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1ac00 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
1ac10 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1ac20 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1ac30 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1ac40 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1ac50 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
1ac60 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1ac70 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1ac80 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1ac90 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1aca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1acb0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1acc0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
1acd0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
1ace0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1acf0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1ad00 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
1ad10 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
1ad20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
1ad30 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
1ad40 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
1ad50 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
1ad60 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
1ad70 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
1ad80 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
1ad90 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
1ada0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
1adb0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
1adc0 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
1add0 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
1ade0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
1adf0 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
1ae00 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
1ae10 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
1ae20 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1ae30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
1ae40 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
1ae50 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
1ae60 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1ae70 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
1ae80 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
1ae90 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
1aea0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1aeb0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
1aec0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
1aed0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1aee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1aef0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1af00 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
1af10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
1af20 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
1af30 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
1af40 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
1af50 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
1af60 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
1af70 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
1af80 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
1af90 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
1afa0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
1afb0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
1afc0 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
1afd0 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
1afe0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
1aff0 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
1b000 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
1b010 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
1b020 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
1b030 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
1b040 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1b050 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1b060 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
1b070 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
1b080 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
1b090 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
1b0a0 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
1b0b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
1b0c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b0d0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1b0e0 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
1b0f0 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
1b100 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
1b110 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
1b120 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
1b130 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
1b140 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
1b150 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
1b160 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1b170 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
1b180 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
1b190 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
1b1a0 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
1b1b0 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
1b1c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1b1d0 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
1b1e0 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
1b1f0 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
1b200 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
1b210 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
1b220 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
1b230 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
1b240 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
1b250 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
1b260 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1b270 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1b280 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1b290 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1b2a0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1b2b0 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1b2c0 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1b2d0 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1b2e0 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1b2f0 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1b300 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1b310 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1b320 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1b330 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1b340 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1b350 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1b360 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1b370 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1b380 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1b390 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1b3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1b3b0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1b3c0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
1b3d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1b3e0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1b3f0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
1b400 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
1b410 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b440 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1b450 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20  r *p */.  nByte 
1b460 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1b470 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1b480 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
1b490 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1b4a0 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55  eld+1);.  p = (U
1b4b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
1b4c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1b4d0 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
1b4e0 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21   nByte);.  if( !
1b4f0 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1b500 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1b510 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1b520 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1b530 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1b540 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1b550 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1b560 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1b570 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1b580 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1b590 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1b5a0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1b5b0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1b5c0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1b5d0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1b5e0 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1b5f0 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1b600 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1b610 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1b620 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1b630 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1b640 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1b650 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1b660 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1b670 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1b680 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1b690 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1b6a0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1b6b0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1b6c0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1b6d0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1b6e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b6f0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1b700 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1b710 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1b720 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1b730 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1b740 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1b750 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1b760 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1b770 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1b780 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b790 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1b7a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b7b0 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
1b7c0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b7f0 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1b800 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1b810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1b830 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1b840 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1b850 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1b860 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1b870 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1b880 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1b890 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1b8a0 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1b8b0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1b8c0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1b8d0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1b8e0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1b8f0 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
1b900 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1b910 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1b920 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1b930 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1b940 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1b950 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1b960 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1b970 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1b980 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1b990 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1b9a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b9b0 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1b9c0 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1b9d0 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1b9e0 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  c = 0;.    pMem-
1b9f0 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  >z = 0;.    d +=
1ba00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1ba10 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1ba20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1ba30 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1ba40 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1ba50 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1ba60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ba70 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  u<=pKeyInfo->nKe
1ba80 79 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20  yField + 1 );.  
1ba90 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d  p->nField = u;.}
1baa0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1bab0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
1bac0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1bad0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
1bae0 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
1baf0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
1bb00 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
1bb10 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1bb20 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
1bb30 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
1bb40 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
1bb50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1bb60 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
1bb70 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
1bb80 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
1bb90 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1bba0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
1bbb0 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
1bbc0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
1bbd0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
1bbe0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
1bbf0 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
1bc00 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
1bc10 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
1bc20 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
1bc30 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
1bc40 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
1bc50 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
1bc60 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1bc70 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
1bc80 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
1bc90 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
1bca0 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
1bcb0 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1bcc0 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
1bcd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bce0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1bcf0 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
1bd00 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1bd10 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1bd20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
1bd30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1bd40 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
1bd50 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
1bd60 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
1bd70 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
1bd80 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
1bd90 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1bda0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1bdb0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1bdc0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1bdd0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1bde0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1bdf0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1be00 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
1be10 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
1be20 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
1be30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1be40 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1be50 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
1be60 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
1be70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1be80 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
1be90 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
1bea0 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
1beb0 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
1bec0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
1bed0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1bee0 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
1bef0 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
1bf00 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
1bf10 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1bf20 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
1bf30 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
1bf40 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
1bf50 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
1bf60 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
1bf70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1bf80 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
1bf90 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
1bfa0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
1bfb0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
1bfc0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1bfd0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
1bfe0 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
1bff0 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
1c000 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
1c010 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
1c020 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
1c030 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
1c040 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
1c050 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
1c060 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
1c070 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
1c080 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
1c090 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
1c0a0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
1c0b0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
1c0c0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
1c0d0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
1c0e0 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
1c0f0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
1c100 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
1c110 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c120 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
1c130 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
1c140 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
1c150 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
1c160 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
1c170 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
1c180 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
1c190 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
1c1a0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
1c1b0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
1c1c0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
1c1d0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
1c1e0 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
1c1f0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1c200 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73  szHdr1);.  if( s
1c210 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72 65  zHdr1>98307 ) re
1c220 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c230 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  UPT;.  d1 = szHd
1c240 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
1c250 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1c260 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1c270 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  d || CORRUPT_DB 
1c280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1c290 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c2a0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1c2b0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  ( pKeyInfo->nKey
1c2c0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1c2d0 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1c2e0 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1c2f0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1c300 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
1c310 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1c320 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
1c330 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
1c340 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
1c350 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
1c360 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
1c370 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
1c380 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  pe1 );..    /* V
1c390 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
1c3a0 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73   is enough key s
1c3b0 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74  pace remaining t
1c3c0 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61  o avoid.    ** a
1c3d0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
1c3e0 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61  .  The "d1+seria
1c3f0 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78  l_type1+2" subex
1c400 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20  pression will.  
1c410 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67    ** always be g
1c420 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1c430 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75  qual to the amou
1c440 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b  nt of required k
1c450 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ey space..    **
1c460 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78   Use that approx
1c470 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64  imation to avoid
1c480 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73   the more expens
1c490 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ive call to.    
1c4a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1c4b0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e  rialTypeLen() in
1c4c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1c4d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c4e0 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31   d1+serial_type1
1c4f0 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20  +2>(u32)nKey1.  
1c500 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33     && d1+sqlite3
1c510 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1c520 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
1c530 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20  (u32)nKey1 .    
1c540 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1c550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
1c560 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
1c570 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
1c580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
1c590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1c5a0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1c5b0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
1c5c0 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
1c5d0 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
1c5e0 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
1c5f0 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
1c600 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
1c610 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b  ey2->aMem[i], pK
1c620 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1c630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1c640 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c650 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1c660 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1c670 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1c680 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1c690 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
1c6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c6b0 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74   -rc;  /* Invert
1c6c0 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
1c6d0 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
1c6e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1c6f0 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70    goto debugComp
1c700 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  areEnd;.    }.  
1c710 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28    i++;.  }while(
1c720 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
1c730 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1c740 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1c750 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1c760 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1c770 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1c780 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1c790 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1c7a0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1c7b0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1c7c0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1c7d0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1c7e0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1c7f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1c800 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a  ease(&mem1)..  *
1c810 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1c820 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1c830 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1c840 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1c850 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1c860 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1c870 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1c880 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1c890 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1c8a0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1c8b0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1c8c0 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  lue.  */.  rc = 
1c8d0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1c8e0 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72  rc;..debugCompar
1c8f0 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69  eEnd:.  if( desi
1c900 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20  redResult==0 && 
1c910 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
1c920 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1c930 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20  esult<0 && rc<0 
1c940 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c950 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e  ( desiredResult>
1c960 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75  0 && rc>0 ) retu
1c970 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52  rn 1;.  if( CORR
1c980 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20  UPT_DB ) return 
1c990 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  1;.  if( pKeyInf
1c9a0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1c9b0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
1c9c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c9d0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1c9e0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1c9f0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1ca00 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e   of fields (a.k.
1ca10 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74  a. columns) in t
1ca20 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
1ca30 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e  by.** pKey,nKey.
1ca40 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61    The verify tha
1ca50 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20  t this count is 
1ca60 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1ca70 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d  al to the.** lim
1ca80 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79  it given by pKey
1ca90 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e  Info->nAllField.
1caa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1cab0 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1cac0 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1cad0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1cae0 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1caf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1cb00 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1cb10 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1cb20 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1cb30 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1cb40 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1cb50 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1cb60 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1cb70 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1cb80 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b 65 79 46 69  e KeyInfo.nKeyFi
1cb90 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1cba0 41 6c 6c 46 69 65 6c 64 20 76 61 6c 75 65 73 20  AllField values 
1cbb0 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  were computed.**
1cbc0 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f   incorrectly..*/
1cbd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
1cbe0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1cbf0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20  tWithinLimits(. 
1cc00 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
1cc10 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1cc20 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20  * The record to 
1cc30 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e  verify */ .  con
1cc40 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
1cc50 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f  Info       /* Co
1cc60 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20  mpare size with 
1cc70 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  this KeyInfo */.
1cc80 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  ){.  int nField 
1cc90 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72  = 0;.  u32 szHdr
1cca0 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
1ccb0 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f  32 notUsed;.  co
1ccc0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1ccd0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1cce0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1ccf0 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52  pKey;..  if( COR
1cd00 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1cd10 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1cd20 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1cd30 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  r);.  assert( nK
1cd40 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
1cd50 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e  t( szHdr<=(u32)n
1cd60 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  Key );.  while( 
1cd70 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20  idx<szHdr ){.   
1cd80 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1cd90 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f  t32(aKey+idx, no
1cda0 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65  tUsed);.    nFie
1cdb0 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ld++;.  }.  asse
1cdc0 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b  rt( nField <= pK
1cdd0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1cde0 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  d );.}.#else.# d
1cdf0 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74  efine vdbeAssert
1ce00 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1ce10 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65  Limits(A,B,C).#e
1ce20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
1ce30 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
1ce40 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
1ce50 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
1ce60 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
1ce70 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
1ce80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1ce90 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
1cea0 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
1ceb0 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
1cec0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
1ced0 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
1cee0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1cef0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1cf00 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
1cf10 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
1cf20 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
1cf30 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
1cf40 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
1cf50 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
1cf60 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1cf70 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1cf80 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
1cf90 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
1cfa0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
1cfb0 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
1cfe0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
1cff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
1d000 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
1d010 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
1d020 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
1d030 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
1d040 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
1d050 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
1d060 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
1d070 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1d080 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
1d090 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
1d0a0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1d0b0 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
1d0c0 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
1d0d0 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
1d0e0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
1d0f0 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
1d100 76 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  v2;.    Mem c1;.
1d110 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
1d120 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1d130 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
1d140 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1d150 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1d160 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
1d170 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1d180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1d190 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1d1a0 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
1d1b0 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
1d1c0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1d1d0 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
1d1e0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1d1f0 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
1d200 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1d210 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
1d220 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d  ->enc);.    v2 =
1d230 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1d240 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1d250 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
1d260 63 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d  c);.    if( (v1=
1d270 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a  =0 || v2==0) ){.
1d280 20 20 20 20 20 20 69 66 28 20 70 72 63 45 72 72        if( prcErr
1d290 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
1d2a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1d2b0 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
1d2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d2d0 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  c = pColl->xCmp(
1d2e0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31  pColl->pUser, c1
1d2f0 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32  .n, v1, c2.n, v2
1d300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1d310 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1d320 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c  se(&c1);.    sql
1d330 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1d340 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74  se(&c2);.    ret
1d350 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
1d360 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70  *.** The input p
1d370 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65  Blob is guarante
1d380 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20  ed to be a Blob 
1d390 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b  that is not mark
1d3a0 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a  ed.** with MEM_Z
1d3b0 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ero.  Return tru
1d3c0 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65  e if it could be
1d3d0 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f   a zero-blob..*/
1d3e0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c  .static int isAl
1d3f0 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72  lZero(const char
1d400 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
1d410 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1d420 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1d430 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72  if( z[i] ) retur
1d440 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1d450 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
1d460 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e  mpare two blobs.
1d470 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1d480 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1d490 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1d4a0 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  t.** is less tha
1d4b0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1d4c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1d4d0 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74   second, respect
1d4e0 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65  ively..** If one
1d4f0 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69   blob is a prefi
1d500 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
1d510 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72  then the shorter
1d520 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a   is the lessor..
1d530 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1d540 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1d550 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1d560 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1d570 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1d580 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
1d590 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20   n1 = pB1->n;.  
1d5a0 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b  int n2 = pB2->n;
1d5b0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73  ..  /* It is pos
1d5c0 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20  sible to have a 
1d5d0 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20  Blob value that 
1d5e0 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72  has some non-zer
1d5f0 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66  o content.  ** f
1d600 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
1d610 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68  content.  But th
1d620 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70  at only comes up
1d630 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65   for Blobs forme
1d640 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50  d.  ** by the OP
1d650 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1d660 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f  de, and such Blo
1d670 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73  bs never get pas
1d680 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
1d690 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1d6a0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
1d6b0 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB1->flags & ME
1d6c0 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31  M_Zero)==0 || n1
1d6d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1d6e0 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB2->flags & M
1d6f0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1d700 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  2==0 );..  if( (
1d710 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e  pB1->flags|pB2->
1d720 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72  flags) & MEM_Zer
1d730 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31  o ){.    if( pB1
1d740 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66  ->flags & pB2->f
1d750 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1d760 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d770 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70  pB1->u.nZero - p
1d780 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1d790 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e   }else if( pB1->
1d7a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1d7b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
1d7c0 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c  sAllZero(pB2->z,
1d7d0 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB2->n) ) retur
1d7e0 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1d7f0 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1d800 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  - n2;.    }else{
1d810 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1d820 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42  lZero(pB1->z, pB
1d830 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b  1->n) ) return +
1d840 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1d850 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72  n1 - pB2->u.nZer
1d860 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  o;.    }.  }.  c
1d870 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1d880 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20  , pB2->z, n1>n2 
1d890 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66  ? n2 : n1);.  if
1d8a0 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1d8b0 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32    return n1 - n2
1d8c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1d8d0 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
1d8e0 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  en a 64-bit sign
1d8f0 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61  ed integer and a
1d900 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1d910 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72  -point.** number
1d920 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1d930 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1d940 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1d950 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73  st (i64) is less
1d960 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20   than,.** equal 
1d970 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1d980 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28  han the second (
1d990 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  double)..*/.stat
1d9a0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
1d9b0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36  tFloatCompare(i6
1d9c0 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a  4 i, double r){.
1d9d0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e    if( sizeof(LON
1d9e0 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20  GDOUBLE_TYPE)>8 
1d9f0 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  ){.    LONGDOUBL
1da00 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47  E_TYPE x = (LONG
1da10 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20  DOUBLE_TYPE)i;. 
1da20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74     if( x<r ) ret
1da30 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1da40 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  x>r ) return +1;
1da50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1da60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1da70 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b  y;.    double s;
1da80 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33  .    if( r<-9223
1da90 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e  372036854775808.
1daa0 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  0 ) return +1;. 
1dab0 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37 32     if( r>9223372
1dac0 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20 29  036854775807.0 )
1dad0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1dae0 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1daf0 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1db00 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1db10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d   ){.      if( y=
1db20 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20  =SMALLEST_INT64 
1db30 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72  && r>0.0 ) retur
1db40 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1db50 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn +1;.    }.   
1db60 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a   s = (double)i;.
1db70 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65      if( s<r ) re
1db80 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1db90 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   s>r ) return +1
1dba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1dbb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1dbc0 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1dbd0 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1dbe0 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1dbf0 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1dc00 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1dc10 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1dc20 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1dc30 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1dc40 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1dc50 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1dc60 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1dc70 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1dc80 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1dc90 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1dca0 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1dcb0 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1dcc0 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1dcd0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1dce0 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1dcf0 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1dd00 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1dd10 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1dd20 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1dd30 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1dd40 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1dd50 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1dd60 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1dd70 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1dd80 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1dd90 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1dda0 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1ddb0 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1ddc0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1ddd0 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1dde0 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1ddf0 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1de00 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1de10 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f  2;.  assert( (co
1de20 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
1de30 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
1de40 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1de50 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1de60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1de70 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1de80 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1de90 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1dea0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1deb0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1dec0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1ded0 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1dee0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1def0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65  .  }..  /* At le
1df00 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
1df10 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e  wo values is a n
1df20 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  umber.  */.  if(
1df30 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1df40 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
1df50 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  l) ){.    if( (f
1df60 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  1 & f2 & MEM_Int
1df70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1df80 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
1df90 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1dfa0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1dfb0 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d   pMem1->u.i > pM
1dfc0 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1dfd0 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1dfe0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1dff0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1e000 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1e010 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1e020 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r < pMem2->u.r
1e030 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1e040 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1e050 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r > pMem2->u.r 
1e060 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1e070 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e080 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1e090 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1e0a0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1e0b0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1e0c0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1e0d0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1e0e0 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d  e(pMem1->u.i, pM
1e0f0 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em2->u.r);.     
1e100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e110 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1e120 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1e130 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
1e140 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1e150 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1e160 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e170 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
1e180 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e  tCompare(pMem2->
1e190 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29  u.i, pMem1->u.r)
1e1a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e1b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
1e1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e1d0 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
1e1e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
1e1f0 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
1e200 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
1e210 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
1e220 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
1e230 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
1e240 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
1e250 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1e260 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
1e270 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1e280 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
1e290 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
1e2a0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1e2b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1e2c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e2d0 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
1e2e0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1e2f0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
1e300 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1e310 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
1e320 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61  || pMem1->db->ma
1e330 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1e340 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1e350 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1e360 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
1e370 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
1e380 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
1e390 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1e3a0 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
1e3b0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
1e3c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
1e3d0 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
1e3e0 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
1e3f0 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
1e400 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
1e410 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e420 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
1e430 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
1e440 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
1e450 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
1e460 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
1e470 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1e480 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
1e490 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
1e4a0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1e4b0 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
1e4c0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
1e4d0 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
1e4e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1e4f0 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
1e500 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
1e510 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
1e520 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
1e530 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
1e540 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
1e550 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
1e560 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
1e570 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
1e580 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
1e590 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
1e5a0 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
1e5b0 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1e5c0 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
1e5d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1e5e0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
1e5f0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
1e600 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
1e610 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
1e620 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
1e630 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
1e640 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
1e650 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
1e660 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
1e670 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
1e680 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1e690 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
1e6a0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
1e6b0 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
1e6c0 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
1e6d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
1e6e0 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
1e6f0 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
1e700 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1e710 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
1e720 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
1e730 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
1e740 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
1e750 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
1e760 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
1e770 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
1e780 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
1e790 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
1e7a0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1e7b0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1e7c0 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
1e7d0 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
1e7e0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e7f0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e800 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1e810 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
1e820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e830 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
1e850 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1e860 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
1e870 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e880 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e890 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
1e8a0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1e8b0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
1e8c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e8d0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e8e0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1e8f0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1e900 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1e910 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1e920 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
1e930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e940 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e950 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
1e960 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e970 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1e980 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1e990 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
1e9a0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
1e9b0 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
1e9c0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1e9d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e9e0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e9f0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1ea00 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1ea10 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1ea20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1ea30 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
1ea40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
1ea50 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
1ea60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1ea70 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1ea80 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
1ea90 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
1eaa0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
1eab0 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
1eac0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1ead0 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1eae0 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1eaf0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1eb00 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1eb10 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1eb20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1eb30 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1eb40 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1eb50 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1eb60 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1eb70 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
1eb80 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
1eb90 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
1eba0 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
1ebb0 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
1ebc0 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
1ebd0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1ebe0 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
1ebf0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1ec00 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
1ec10 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
1ec20 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
1ec30 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
1ec40 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
1ec50 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
1ec60 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
1ec70 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
1ec80 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
1ec90 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
1eca0 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
1ecb0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
1ecc0 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
1ecd0 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
1ece0 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
1ecf0 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
1ed00 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1ed10 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
1ed20 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
1ed30 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1ed40 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
1ed50 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1ed60 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
1ed70 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
1ed80 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
1ed90 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1eda0 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
1edb0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
1edc0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
1edd0 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
1ede0 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
1edf0 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
1ee00 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
1ee10 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
1ee20 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
1ee30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1ee40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1ee50 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
1ee60 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1ee70 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1ee80 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1ee90 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1eea0 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
1eeb0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1eec0 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eee0 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
1eef0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
1ef00 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1ef30 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1ef40 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1ef50 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ef80 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
1ef90 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
1efa0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1efc0 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
1efd0 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
1efe0 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1f010 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
1f020 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1f030 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1f040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f050 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
1f060 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
1f070 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
1f080 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
1f090 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
1f0a0 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
1f0b0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b   *pKeyInfo = pPK
1f0c0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1f0d0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f0e0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1f0f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1f100 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65  ar *)pKey1;.  Me
1f110 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66  m mem1;..  /* If
1f120 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20   bSkip is true, 
1f130 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
1f140 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65  has already dete
1f150 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1f160 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65  first.  ** two e
1f170 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b  lements in the k
1f180 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46  eys are equal. F
1f190 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  ix the various s
1f1a0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73  tack variables s
1f1b0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  o.  ** that this
1f1c0 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20   routine begins 
1f1d0 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65  comparing at the
1f1e0 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a   second field. *
1f1f0 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b  /.  if( bSkip ){
1f200 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20  .    u32 s1;.   
1f210 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56   idx1 = 1 + getV
1f220 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
1f230 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64  ], s1);.    szHd
1f240 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20  r1 = aKey1[0];. 
1f250 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b     d1 = szHdr1 +
1f260 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f270 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20  alTypeLen(s1);. 
1f280 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52     i = 1;.    pR
1f290 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hs++;.  }else{. 
1f2a0 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72     idx1 = getVar
1f2b0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1f2c0 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73  dr1);.    d1 = s
1f2d0 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64  zHdr1;.    if( d
1f2e0 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
1f2f0 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65  1 ){ .      pPKe
1f300 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1f310 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1f320 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1f330 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1f340 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1f350 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1f360 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1f370 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1f380 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1f390 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1f3a0 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  ments */.  asser
1f3b0 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1f3c0 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d  nfo->nAllField>=
1f3d0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1f3e0 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1f3f0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1f400 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1f410 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1f420 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f430 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1f440 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a  >nKeyField>0 );.
1f450 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1f460 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1f470 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1f480 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1f490 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1f4a0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1f4b0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1f4c0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1f4d0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1f4e0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1f4f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f500 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1f510 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1f520 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1f530 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1f540 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f550 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1f570 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1f580 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1f590 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1f5a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1f5b0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1f5c0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1f5d0 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
1f5e0 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
1f5f0 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
1f600 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
1f610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f620 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1f630 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1f640 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1f650 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1f660 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1f670 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1f680 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1f690 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1f6a0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1f6b0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1f6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1f6d0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1f6e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f6f0 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1f700 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1f710 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1f720 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1f730 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1f740 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1f750 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f760 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1f770 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1f780 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1f790 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1f7a0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1f7b0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1f7c0 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1f7d0 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1f7e0 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1f7f0 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1f800 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1f810 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1f820 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1f830 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1f840 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1f850 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1f860 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1f870 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1f880 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1f890 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f8a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1f8b0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1f8c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1f8d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1f8e0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1f8f0 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1f900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1f910 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1f920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
1f930 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
1f940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f950 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1f960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1f970 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
1f980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f990 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1f9a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1f9b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1f9c0 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
1f9d0 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
1f9e0 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
1f9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fa00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1fa10 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1fa20 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1fa30 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1fa40 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1fa50 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1fa60 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1fa70 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1fa80 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1fa90 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1faa0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1fab0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1fac0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1fad0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1fae0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1faf0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1fb00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fb10 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1fb20 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1fb30 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1fb40 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1fb50 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1fb60 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1fb70 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1fb80 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1fb90 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1fba0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1fbb0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1fbc0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1fbd0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1fbe0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1fbf0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fc00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1fc10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1fc30 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1fc40 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
1fc50 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
1fc60 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
1fc70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1fc80 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
1fc90 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1fca0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
1fcb0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
1fcc0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
1fcd0 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
1fce0 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
1fcf0 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
1fd00 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
1fd10 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
1fd20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
1fd30 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
1fd40 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
1fd50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1fd60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fd70 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1fd80 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
1fd90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1fda0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1fdb0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1fdc0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1fdd0 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
1fde0 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
1fdf0 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
1fe00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fe10 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
1fe20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1fe30 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1fe40 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
1fe50 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66  assert( (pRhs->f
1fe60 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1fe70 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d  ==0 || pRhs->n==
1fe80 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61  0 );.      getVa
1fe90 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1fea0 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1feb0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fec0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1fed0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1fee0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
1fef0 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
1ff00 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1ff10 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1ff20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ff30 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
1ff40 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1ff50 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1ff60 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
1ff70 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1ff80 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1ff90 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
1ffa0 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1ffb0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1ffc0 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
1ffd0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1ffe0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1fff0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20010 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
20020 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20030 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
20040 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
20050 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d   }else if( pRhs-
20060 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
20070 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
20080 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63  f( !isAllZero((c
20090 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79  onst char*)&aKey
200a0 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20  1[d1],nStr) ){. 
200b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
200c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
200d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
200e0 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
200f0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
20100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20120 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  int nCmp = MIN(n
20130 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  Str, pRhs->n);. 
20140 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
20150 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
20160 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
20170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
20180 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72  c==0 ) rc = nStr
20190 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20   - pRhs->n;.    
201a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
201b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
201c0 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65  is null */.    e
201d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61  lse{.      seria
201e0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
201f0 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  dx1];.      rc =
20200 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30   (serial_type!=0
20210 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
20220 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
20230 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
20240 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
20250 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
20260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20270 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
20280 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20290 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
202a0 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
202b0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
202c0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
202d0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
202e0 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
202f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
20300 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73     i++;.    pRhs
20310 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71  ++;.    d1 += sq
20320 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
20330 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
20340 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d  pe);.    idx1 +=
20350 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
20360 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
20370 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28    }while( idx1<(
20380 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20  unsigned)szHdr1 
20390 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
203a0 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69  eld && d1<=(unsi
203b0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20  gned)nKey1 );.. 
203c0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
203d0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
203e0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
203f0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
20400 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
20410 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
20420 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
20430 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
20440 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
20450 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
20460 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
20470 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
20480 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73  mem1).  */.  ass
20490 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
204a0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
204b0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
204c0 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
204d0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
204e0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
204f0 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
20500 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
20510 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
20520 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
20530 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
20540 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alue.  */.  asse
20550 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a  rt( CORRUPT_DB .
20560 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65         || vdbeRe
20570 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
20580 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20590 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64  PKey2, pPKey2->d
205a0 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20  efault_rc) .    
205b0 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e     || pKeyInfo->
205c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
205d0 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e  .  );.  pPKey2->
205e0 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65  eqSeen = 1;.  re
205f0 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
20600 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
20610 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20620 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
20630 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
20640 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
20650 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
20660 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
20670 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
20680 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20690 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
206a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
206b0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
206c0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
206d0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
206e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
206f0 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
20700 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
20710 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
20720 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
20730 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
20740 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
20750 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
20760 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
20770 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
20780 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
20790 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
207a0 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
207b0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
207c0 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
207d0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
207e0 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
207f0 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
20800 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
20810 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
20820 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
20830 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
20840 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
20850 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
20860 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
20870 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20880 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
20890 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
208a0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
208b0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
208c0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
208d0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
208e0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
208f0 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
20900 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
20910 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
20920 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
20930 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
20940 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
20950 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
20960 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
20970 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73  i64 v;.  i64 lhs
20980 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
20990 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
209a0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
209b0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
209c0 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
209d0 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
209e0 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
209f0 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
20a00 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
20a10 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
20a20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
20a30 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
20a40 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
20a50 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20a60 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20a70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20a80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
20a90 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
20aa0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20ab0 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
20ac0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20ad0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20ae0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20af0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20b00 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
20b10 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20b20 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
20b30 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
20b40 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20b50 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20b70 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
20b80 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
20b90 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20ba0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
20bb0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
20bc0 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
20bd0 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
20be0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20bf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20c00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
20c10 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
20c20 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20c30 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
20c40 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
20c50 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
20c60 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
20c70 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20c80 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20ca0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
20cb0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
20cc0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
20cd0 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
20ce0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
20cf0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
20d00 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20d10 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
20d20 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
20d30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20d40 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
20d50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20d60 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
20d70 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
20d80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
20d90 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
20da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
20db0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
20dc0 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
20dd0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
20de0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
20df0 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
20e00 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
20e10 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
20e20 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
20e30 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
20e40 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
20e50 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
20e60 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
20e70 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
20e80 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
20e90 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
20ea0 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
20eb0 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
20ec0 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
20ed0 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
20ee0 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
20ef0 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
20f00 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
20f10 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
20f20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
20f30 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
20f40 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
20f50 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
20f60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20f70 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
20f80 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20f90 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
20fa0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
20fb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20fc0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
20fd0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
20fe0 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65  .  }..  v = pPKe
20ff0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
21000 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
21010 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21020 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
21030 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
21040 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
21050 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
21060 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
21070 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
21080 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
21090 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
210a0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
210b0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
210c0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
210d0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
210e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
210f0 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
21100 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
21110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
21120 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
21130 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
21140 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
21150 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
21160 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
21170 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
21180 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
21190 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
211a0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
211b0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
211c0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
211d0 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  n = 1;.  }..  as
211e0 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
211f0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
21200 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21210 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74  2, res) );.  ret
21220 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
21230 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21240 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
21250 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
21260 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21270 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
21280 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
21290 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
212a0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
212b0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
212c0 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
212d0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
212e0 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
212f0 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
21300 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
21310 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
21320 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
21330 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
21340 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
21350 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
21360 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
21370 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
21380 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
21390 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
213a0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
213b0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
213c0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
213d0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
213e0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  ey1 = (const u8*
213f0 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65  )pKey1;.  int se
21400 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74  rial_type;.  int
21410 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
21420 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21430 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  .flags & MEM_Str
21440 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74   );.  vdbeAssert
21450 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
21460 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
21470 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
21480 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
21490 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
214a0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
214b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
214c0 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
214d0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
214e0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
214f0 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
21500 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
21510 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
21520 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
21530 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
21540 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
21550 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
21560 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
21570 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
21580 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
21590 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
215a0 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
215b0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
215c0 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
215d0 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
215e0 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
215f0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21600 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21610 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21620 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21630 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
21640 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
21650 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
21660 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
21670 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
21680 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
21690 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
216a0 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
216b0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
216c0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
216d0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
216e0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
216f0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
21700 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
21710 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
21720 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
21730 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21740 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
21750 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21760 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
21770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
21780 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
21790 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
217a0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65     pPKey2->eqSee
217b0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
217c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
217d0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
217e0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
217f0 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
21800 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
21810 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
21820 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
21830 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
21840 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
21850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21860 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21870 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
21880 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
21890 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
218a0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
218b0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
218c0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
218d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
218e0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
218f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
21900 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
21910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21920 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
21930 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21940 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
21950 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
21960 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
21970 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
21980 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
21990 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
219a0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
219b0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
219c0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
219d0 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
219e0 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
219f0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
21a00 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
21a10 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
21a20 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
21a30 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
21a40 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
21a50 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
21a60 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
21a70 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
21a80 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
21a90 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
21aa0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
21ab0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
21ac0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
21ad0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
21ae0 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
21af0 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
21b00 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
21b10 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
21b20 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
21b30 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
21b40 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
21b50 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
21b60 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
21b70 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
21b80 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
21b90 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
21ba0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
21bb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
21bc0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
21bd0 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
21be0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
21bf0 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
21c00 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
21c10 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
21c20 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
21c30 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
21c40 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
21c50 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
21c60 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
21c70 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
21c80 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
21c90 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
21ca0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
21cb0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
21cc0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
21cd0 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
21ce0 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
21cf0 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
21d00 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
21d10 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
21d20 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
21d30 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  s.  */.  if( p->
21d40 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
21d50 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  eld<=13 ){.    i
21d60 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
21d70 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
21d80 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
21d90 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
21da0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
21db0 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
21dc0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
21dd0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
21de0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
21df0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
21e00 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
21e10 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
21e20 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
21e30 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
21e40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21e50 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
21e60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21e70 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
21e80 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21e90 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
21ea0 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
21eb0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
21ec0 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
21ed0 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
21ee0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
21ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
21f00 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
21f10 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
21f20 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
21f30 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
21f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
21f50 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
21f60 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
21f70 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
21f80 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
21f90 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
21fa0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
21fb0 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
21fc0 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
21fd0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
21fe0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
21ff0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
22000 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
22010 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
22020 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
22030 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
22040 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
22050 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
22060 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
22070 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
22080 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
22090 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
220a0 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
220b0 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
220c0 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
220d0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
220e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
220f0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
22100 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
22110 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
22120 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
22130 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
22140 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
22150 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
22160 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
22170 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
22180 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
22190 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
221a0 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
221b0 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
221c0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
221d0 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
221e0 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
221f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
22200 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
22210 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
22220 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
22230 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
22240 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
22250 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
22260 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
22270 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
22280 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
22290 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
222a0 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
222b0 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
222c0 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
222d0 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
222e0 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
222f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
22300 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22310 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
22320 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
22330 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
22340 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
22350 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
22360 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
22370 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
22380 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
22390 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
223a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
223b0 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
223c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
223d0 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
223e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
223f0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
22400 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
22410 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66  llKey, &m);.  if
22420 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
22430 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
22440 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   The index entry
22450 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
22460 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a   a header size *
22470 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
22480 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
22490 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61  szHdr);.  testca
224a0 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a  se( szHdr==3 );.
224b0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
224c0 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20  r==m.n );.  if( 
224d0 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33  unlikely(szHdr<3
224e0 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d   || (int)szHdr>m
224f0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
22500 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
22510 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
22520 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
22530 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
22540 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
22550 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
22560 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
22570 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
22580 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
22590 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
225a0 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
225b0 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
225c0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
225d0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
225e0 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
225f0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
22600 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22610 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
22620 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22630 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
22640 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22650 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
22660 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
22670 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22680 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
22690 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
226a0 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
226b0 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
226c0 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
226d0 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
226e0 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
226f0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
22700 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
22710 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
22720 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
22730 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
22740 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
22750 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
22760 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
22770 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
22780 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
22790 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
227a0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
227b0 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
227c0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
227d0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
227e0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
227f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
22800 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
22810 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
22820 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
22830 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
22840 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22850 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
22860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
22870 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
22880 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
22890 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
228a0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
228b0 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
228c0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
228d0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
228e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
228f0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
22900 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
22910 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
22920 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
22930 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
22940 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
22950 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
22970 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
22980 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
22990 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
229a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
229b0 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
229c0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
229d0 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
229e0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
229f0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
22a00 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
22a10 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
22a20 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
22a30 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
22a40 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
22a50 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
22a60 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
22a70 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
22a80 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
22a90 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
22aa0 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
22ab0 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
22ac0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
22ad0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
22ae0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
22af0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
22b00 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
22b10 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
22b20 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
22b30 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
22b40 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
22b50 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
22b60 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
22b70 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
22b80 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
22b90 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
22ba0 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
22bb0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22bd0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
22be0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
22bf0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
22c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22c10 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
22c20 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
22c30 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22c40 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
22c50 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
22c60 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
22c70 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
22ca0 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
22cb0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
22cc0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
22cd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
22ce0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
22cf0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
22d00 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
22d10 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
22d20 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
22d30 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
22d40 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
22d50 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
22d60 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
22d70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
22d80 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
22d90 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
22da0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
22db0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
22dc0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
22dd0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
22de0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
22df0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
22e00 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
22e10 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
22e20 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
22e30 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
22e40 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
22e50 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
22e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22e70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22e80 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
22e90 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
22ea0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
22eb0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
22ec0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
22ed0 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
22ee0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22f00 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
22f10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22f20 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
22f30 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
22f40 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
22f50 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
22f60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
22f70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
22f80 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
22f90 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
22fa0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
22fb0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
22fc0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
22fd0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
22fe0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
22ff0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
23000 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
23010 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
23020 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23030 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
23040 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
23050 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
23060 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
23070 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
23080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
23090 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
230a0 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
230b0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
230c0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
230d0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
230e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
230f0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
23100 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
23110 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
23120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
23130 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
23140 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
23150 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
23160 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
23170 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
23180 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
23190 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
231a0 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
231b0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
231c0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
231d0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
231e0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
231f0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
23200 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
23210 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
23220 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
23230 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
23240 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
23250 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
23260 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
23270 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
23280 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
23290 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
232a0 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
232b0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
232c0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
232d0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
232e0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
232f0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
23300 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
23310 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
23320 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
23330 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
23340 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
23350 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
23360 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23370 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
23380 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
23390 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
233a0 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
233b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
233c0 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20   SQLITE_PREPARE 
233d0 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62 65  flags for a Vdbe
233e0 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56  ..*/.u8 sqlite3V
233f0 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
23400 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
23410 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b  rn v->prepFlags;
23420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23430 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
23440 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
23450 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
23460 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
23470 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
23480 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
23490 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
234a0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
234b0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
234c0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
234d0 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
234e0 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
234f0 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
23500 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
23510 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
23520 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
23530 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
23540 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
23550 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
23560 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
23570 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
23580 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
23590 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
235a0 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
235b0 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
235c0 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
235d0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
235e0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
235f0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
23600 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
23610 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e      assert( (v->
23620 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
23630 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
23640 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
23650 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
23660 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
23670 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
23680 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
23690 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
236a0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
236b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
236c0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
236d0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
236e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
236f0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
23700 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
23710 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
23720 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
23730 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
23740 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23750 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
23760 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
23770 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
23780 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
23790 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
237a0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
237b0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
237c0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
237d0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
237e0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
237f0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
23800 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
23810 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
23820 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
23830 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d  );.  assert( (v-
23850 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
23860 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
23870 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  =0 );.  if( iVar
23880 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  >=32 ){.    v->e
23890 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30  xpmask |= 0x8000
238a0 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0000;.  }else{. 
238b0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
238c0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
238d0 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  r-1));.  }.}../*
238e0 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63  .** Cause a func
238f0 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e  tion to throw an
23900 20 65 72 72 6f 72 20 69 66 20 69 74 20 77 61 73   error if it was
23910 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75   call from OP_Pu
23920 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72  reFunc.** rather
23930 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f   than OP_Functio
23940 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65  n..**.** OP_Pure
23950 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20  Func means that 
23960 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  the function mus
23970 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74  t be determinist
23980 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ic, and should.*
23990 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * throw an error
239a0 20 69 66 20 69 74 20 69 73 20 67 69 76 65 6e 20   if it is given 
239b0 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c  inputs that woul
239c0 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65  d make it non-de
239d0 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20  terministic..** 
239e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
239f0 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f  invoked by date/
23a00 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  time functions t
23a10 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65  hat use non-dete
23a20 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61  rministic.** fea
23a30 74 75 72 65 73 20 73 75 63 68 20 61 73 20 27 6e  tures such as 'n
23a40 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ow'..*/.int sqli
23a50 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73  te3NotPureFunc(s
23a60 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
23a70 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pCtx){.#ifdef SQ
23a80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
23a90 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
23aa0 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20   pCtx->pVdbe==0 
23ab0 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
23ac0 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70  if.  if( pCtx->p
23ad0 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e  Vdbe->aOp[pCtx->
23ae0 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  iOp].opcode==OP_
23af0 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  PureFunc ){.    
23b00 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
23b10 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
23b20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e     "non-determin
23b30 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69  istic function i
23b40 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  n index expressi
23b50 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73  on or CHECK cons
23b60 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20  traint",.       
23b70 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
23b80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23b90 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
23ba0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
23bb0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
23bc0 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
23bd0 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
23be0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
23bf0 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
23c00 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
23c10 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
23c20 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
23c30 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
23c40 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
23c50 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
23c60 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
23c70 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
23c80 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
23c90 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
23ca0 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
23cb0 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
23cc0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
23cd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
23ce0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
23cf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23d00 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
23d10 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
23d20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
23d30 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
23d40 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
23d50 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
23d60 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
23d70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
23d80 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
23d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
23da0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
23db0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
23dc0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
23dd0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  ./*.** If the se
23de0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
23df0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61   not NULL, relea
23e00 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f  se any allocatio
23e10 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ns associated .*
23e20 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72  * with the memor
23e30 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  y cells in the p
23e40 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20  ->aMem[] array. 
23e50 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e  Also free the Un
23e60 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
23e70 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
23e80 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  , using sqlite3D
23e90 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  bFree()..**.** T
23ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23eb0 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70  used to free Unp
23ec0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
23ed0 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
23ee0 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55   by.** the vdbeU
23ef0 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
23f00 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20  nction found in 
23f10 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74  vdbeapi.c..*/.st
23f20 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
23f30 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74  eeUnpacked(sqlit
23f40 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65  e3 *db, int nFie
23f50 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ld, UnpackedReco
23f60 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
23f70 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69    for(i=0; i<nFi
23f90 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
23fa0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
23fb0 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
23fc0 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
23fd0 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
23fe0 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
23ff0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24000 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
24010 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
24020 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
24030 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
24040 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
24050 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
24060 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e  TE_HOOK./*.** In
24070 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
24080 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
24090 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
240a0 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
240b0 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
240c0 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
240d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
240e0 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
240f0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
24100 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
24110 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
24120 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
24130 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
24140 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
24150 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
24160 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
24170 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
24180 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
24190 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
241a0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
241b0 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
241c0 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
241e0 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
241f0 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
24200 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
24210 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
24220 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
24230 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
24240 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
24250 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
24280 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
24290 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
242a0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
242b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
242c0 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
242d0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242f0 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
24300 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
24330 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
24340 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
24370 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
24380 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24390 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
243a0 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
243b0 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
243c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
243d0 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
243e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
243f0 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
24400 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
24410 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
24420 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
24430 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
24440 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
24450 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
24460 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pTab)==0 ){.    
24470 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20  iKey1 = iKey2 = 
24480 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74 65  0;.    preupdate
24490 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  .pPk = sqlite3Pr
244a0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
244b0 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
244c0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
244d0 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
244e0 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
244f0 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20  [iReg].u.i;.    
24500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65  }else{.      iKe
24510 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20  y2 = iKey1;.    
24520 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
24530 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
24540 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
24550 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
24560 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
24570 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
24580 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
24590 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
245a0 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
245b0 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
245c0 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
245d0 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
245e0 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
245f0 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
24600 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
24610 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
24620 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
24630 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
24640 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
24650 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  eld = pTab->nCol
24660 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
24670 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yinfo.aSortOrder
24680 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72   = (u8*)&fakeSor
24690 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64  tOrder;.  preupd
246a0 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
246b0 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
246c0 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
246d0 70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d  preupdate.pTab =
246e0 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50   pTab;..  db->pP
246f0 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
24700 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
24710 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
24720 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
24730 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
24740 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
24750 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
24760 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
24770 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
24780 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
24790 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
247a0 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
247b0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
247c0 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
247d0 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
247e0 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
247f0 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
24800 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
24810 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
24820 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
24830 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
24840 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
24850 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
24860 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
24870 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
24880 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
24890 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
248a0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
248b0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
248c0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
248d0 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
248e0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
248f0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
24900 20 2a 2f 0a                                       */.