/ Hex Artifact Content
Login

Artifact f51bda6208ea2f0ed3878dbf65e1bf13da1584cb8b3d30ff4de781dd17a4929a:


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 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1180: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1190: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
11a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
11b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
11d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1200: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1210: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1220: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1230: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1260: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1270: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1280: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1290: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
12a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
12b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
12c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
12d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
12e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
12f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1300: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1310: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1320: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1330: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1340: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1350: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1360: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1370: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1380: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1390: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
13a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
13b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
13c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
13d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
13e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
13f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1400: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1410: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1420: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1430: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1440: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1450: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1460: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1470: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1480: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1490: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
14b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
14c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
14d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
14e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
14f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1500: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1510: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1520: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1530: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1540: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1550: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1560: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1570: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1580: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1590: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
15a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
15b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
15c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
15d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
15e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
15f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1610: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1620: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1630: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1640: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1650: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1660: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1670: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1680: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1690: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
16a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
16d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
16e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
16f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1700: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1710: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1720: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1730: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1740: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1750: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1760: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1770: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1780: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1790: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
17a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
17b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
17c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
17d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
17e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
17f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1800: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1810: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1830: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1840: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1850: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1860: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1870: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1880: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
18b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
18c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
18d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
18e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
18f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1900: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1910: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1920: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1930: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1940: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1960: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1970: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1980: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1990: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
19a0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
19d0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
19e0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
19f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1a50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1a60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1a70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1a80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1a90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1aa0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1ab0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ad0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1ae0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1af0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1b00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1b50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1b70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1b80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1b90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1bb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1bd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1be0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1bf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1c20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1c30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1c40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1c50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1c60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1c70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1c80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1c90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1cc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ce0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1cf0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1d00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1d10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1d20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1d30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1d40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1d50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1d80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1db0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1dc0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1dd0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1de0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1df0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1e00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1e10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1e20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1e30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1e40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1e50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1e60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1e70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1e80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1e90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1ea0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1eb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ec0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ee0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ef0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1f00: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1f10: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1f20: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1f30: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1f40: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1f50: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
1f60: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
1f70: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
1f80: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
1f90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
1fa0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
1fb0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1fc0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
1fd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1fe0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2000: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2010: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2020: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2030: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2050: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2060: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2070: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2080: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
20b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
20c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
20e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
20f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2100: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2110: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2140: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2150: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2160: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2170: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2180: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
21b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
21c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
21d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
21e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
21f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2200: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2210: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2240: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2260: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2270: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2280: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2290: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
22d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
22e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
22f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2300: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2310: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2320: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2330: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2340: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2350: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2360: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2370: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2380: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
23a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
23d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
23e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
23f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2400: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2410: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
2420: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
2430: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
2440: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
2450: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2460: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2470: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2480: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2490: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24b0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
24c0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
24f0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2500: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2510: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2520: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2530: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2550: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2560: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2570: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2580: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2590: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
25a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
25b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25c0: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
25d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
25e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
25f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2620: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2630: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
2640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
2660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
2680: 75 72 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51  urrent EXPLAIN Q
2690: 55 45 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69  UERY PLAN baseli
26a0: 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22  ne..** 0 means "
26b0: 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  none"..*/.int sq
26c0: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
26d0: 50 61 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50  Parent(Parse *pP
26e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20  arse){.  VdbeOp 
26f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72  *pOp;.  if( pPar
2700: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d  se->addrExplain=
2710: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2720: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2730: 62 65 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e  beGetOp(pParse->
2740: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61  pVdbe, pParse->a
2750: 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72  ddrExplain);.  r
2760: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d  eturn pOp->p2;.}
2770: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65  ../*.** Set a de
2780: 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
2790: 74 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t on the followi
27a0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  ng routine in or
27b0: 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f  der to.** monito
27c0: 72 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  r the EXPLAIN QU
27d0: 45 52 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65  ERY PLAN code ge
27e0: 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  neration..*/.#if
27f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2800: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
2810: 74 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70  te3ExplainBreakp
2820: 6f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  oint(const char 
2830: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
2840: 2a 7a 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31  *z2){.  (void)z1
2850: 3b 0a 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a  ;.  (void)z2;.}.
2860: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
2870: 64 20 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f  d a new OP_ opco
2880: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
2890: 20 62 50 75 73 68 20 66 6c 61 67 20 69 73 20 74   bPush flag is t
28a0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  rue, then make t
28b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70  his opcode the p
28c0: 61 72 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62  arent for.** sub
28d0: 73 65 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73  sequent Explains
28e0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64   until sqlite3Vd
28f0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69  beExplainPop() i
2900: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  s called..*/.voi
2910: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2920: 6c 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lain(Parse *pPar
2930: 73 65 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f  se, u8 bPush, co
2940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2950: 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ...){.#ifndef SQ
2960: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2970: 41 6c 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74  Always include t
2980: 68 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  he OP_Explain op
2990: 63 6f 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f  codes if SQLITE_
29a0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
29b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20  ..  ** But omit 
29c0: 74 68 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72  them (for perfor
29d0: 6d 61 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72  mance) during pr
29e0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20  oduction builds 
29f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
2a00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
2a10: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61  ndif.  {.    cha
2a20: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62  r *zMsg;.    Vdb
2a30: 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73  e *v;.    va_lis
2a40: 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54  t ap;.    int iT
2a50: 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  his;.    va_star
2a60: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2a70: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56   zMsg = sqlite3V
2a80: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a90: 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  db, zFmt, ap);. 
2aa0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2ab0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
2ac0: 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20  Vdbe;.    iThis 
2ad0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71  = v->nOp;.    sq
2ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2af0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
2b00: 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64  This, pParse->ad
2b10: 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20  drExplain, 0,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e      zMsg, P4_DYN
2b40: 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  AMIC);.    sqlit
2b50: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2b60: 69 6e 74 28 62 50 75 73 68 3f 22 50 55 53 48 22  int(bPush?"PUSH"
2b70: 3a 22 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  :"", sqlite3Vdbe
2b80: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e  GetOp(v,-1)->p4.
2b90: 7a 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  z);.    if( bPus
2ba0: 68 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  h){.      pParse
2bb0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
2bc0: 69 54 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  iThis;.    }.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
2be0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
2bf0: 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c  PLAN stack one l
2c00: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
2c10: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2c20: 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
2c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e){.  sqlite3Exp
2c40: 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22  lainBreakpoint("
2c50: 50 4f 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72  POP", 0);.  pPar
2c60: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  se->addrExplain 
2c70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
2c80: 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73  lainParent(pPars
2c90: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
2ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2cb0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  AIN */../*.** Ad
2cc0: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2cd0: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2cf0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
2d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d10: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
2d20: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
2d30: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
2d40: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
2d50: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2d60: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2d70: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2d80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2db0: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2dc0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2dd0: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2df0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2e00: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
2e10: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
2e20: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
2e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e40: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
2e50: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2e60: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2e70: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2e80: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2e90: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2ea0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2ec0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2ed0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2ee0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2ef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
2f10: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2f20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2f30: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2f40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f60: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2f70: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2f90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2fa0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2fb0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2ff0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
3000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
3010: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
3020: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
3030: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3040: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
3050: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
3060: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
3070: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
30b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70   P4_INT32;.    p
30c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20  Op->p4.i = p4;. 
30d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
30e0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72  he end of a co-r
3100: 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73  outine.*/.void s
3110: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
3120: 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20  outine(Vdbe *v, 
3130: 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20  int regYield){. 
3140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3150: 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
3160: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
3170: 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  ;..  /* Clear th
3180: 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
3190: 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72  ster cache, ther
31a0: 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61  eby ensuring tha
31b0: 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72  t each.  ** co-r
31c0: 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f  outine has its o
31d0: 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  wn independent s
31e0: 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c  et of registers,
31f0: 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74   because co-rout
3200: 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  ines.  ** might 
3210: 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67  expect their reg
3220: 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65  isters to be pre
3230: 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e  served across an
3240: 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20   OP_Yield, and. 
3250: 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63   ** that could c
3260: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66  ause problems if
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d   two or more co-
3280: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69  routines are usi
3290: 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ng the same.  **
32a0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
32b0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70  ter..  */.  v->p
32c0: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
32d0: 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65  = 0;.  v->pParse
32e0: 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
32f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3300: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
3310: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
3320: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
3330: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
3340: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
3350: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
3360: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
3370: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
3380: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
3390: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
33a0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
33b0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
33c0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
33d0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
33e0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
33f0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
3400: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
3410: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
3420: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
3430: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
3440: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
3450: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
3460: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
3470: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
3480: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
3490: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
34a0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
34b0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
34c0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
34d0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
34e0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
34f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
3500: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
3510: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3520: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
3530: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
3540: 2a 20 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20  * (Later:) This 
3550: 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
3560: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
3570: 76 65 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d  ve the OPFLG_JUM
3580: 50 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a  P.** property..*
3590: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73  *.** Variable us
35a0: 61 67 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a  age notes:.**.**
35b0: 20 20 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65       Parse.aLabe
35c0: 6c 5b 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20  l[x]     Stores 
35d0: 74 68 65 20 61 64 64 72 65 73 73 20 74 68 61 74  the address that
35e0: 20 74 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20   the x-th label 
35f0: 72 65 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20  resolves.**     
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74      into.  For t
3620: 65 73 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44  esting (SQLITE_D
3630: 45 42 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65  EBUG), unresolve
3640: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 62               lab
3660: 65 6c 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62  els stores -1, b
3670: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72  ut that is not r
3680: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20  equired..**     
3690: 50 61 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f  Parse.nLabelAllo
36a0: 63 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c  c   Number of sl
36b0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ots allocated to
36c0: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a   Parse.aLabel[].
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a  bel        The *
36f0: 6e 65 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65  negative* of the
3700: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c   number of label
3710: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 62 65 65 6e 20 69 73 73 75         been issu
3740: 65 64 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76  ed.  The negativ
3750: 65 20 69 73 20 73 74 6f 72 65 64 20 62 65 63 61  e is stored beca
3760: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  use.**          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3780: 68 61 74 20 67 69 76 65 73 20 61 20 70 65 72 66  hat gives a perf
3790: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
37a0: 65 6e 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67  ent over storing
37b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
37d0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74  equivalent posit
37e0: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ive value..*/.in
37f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
3800: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50  eLabel(Parse *pP
3810: 61 72 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  arse){.  return 
3820: 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  --pParse->nLabel
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
3840: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
3850: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
3860: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3870: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
3880: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
3890: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
38a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
38b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
38c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
38d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38e0: 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  l()..*/.static S
38f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3900: 6f 69 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76  oid resizeResolv
3910: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c  eLabel(Parse *p,
3920: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29   Vdbe *v, int j)
3930: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  {.  int nNewSize
3940: 20 3d 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65   = 10 - p->nLabe
3950: 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  l;.  p->aLabel =
3960: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3970: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
3980: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39a0: 4e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  NewSize*sizeof(p
39b0: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
39c0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
39d0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
39e0: 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  elAlloc = 0;.  }
39f0: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
3a00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e  ITE_DEBUG.    in
3a10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
3a20: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69  ->nLabelAlloc; i
3a30: 3c 6e 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20  <nNewSize; i++) 
3a40: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
3a50: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  1;.#endif.    p-
3a60: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e  >nLabelAlloc = n
3a70: 4e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e  NewSize;.    p->
3a80: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3a90: 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  Op;.  }.}.void s
3aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3ab0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3ac0: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3ad0: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3ae0: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3b00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3b10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3b20: 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c  rt( j<-p->nLabel
3b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
3b40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
3b50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
3b60: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
3b70: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3b80: 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
3b90: 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45  tf("RESOLVE LABE
3ba0: 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78  L %d to %d\n", x
3bb0: 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23  , v->nOp);.  }.#
3bc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
3bd0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e  LabelAlloc + p->
3be0: 6e 4c 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20  nLabel < 0 ){.  
3bf0: 20 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c    resizeResolveL
3c00: 61 62 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d  abel(p,v,j);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3c20: 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d  ( p->aLabel[j]==
3c30: 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c  (-1) ); /* Label
3c40: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
3c50: 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20  solved once */. 
3c60: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
3c70: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = v->nOp;.  }.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3c90: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3ca0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3cb0: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
3cc0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
3cd0: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
3ce0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3cf0: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Once = 1;.}../*.
3d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c   only be run mul
3d30: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a  tiple times..*/.
3d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d50: 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70  Reusable(Vdbe *p
3d60: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
3d70: 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64  nce = 0;.}..#ifd
3d80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
3d90: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
3da0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
3db0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
3dc0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
3dd0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
3de0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
3df0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e00: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
3e10: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
3e20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
3e30: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
3e40: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
3e50: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
3e60: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
3e70: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3e80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3e90: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
3ea0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
3eb0: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
3ec0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
3ed0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
3ee0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
3f10: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
3f20: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
3f30: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3f40: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
3f50: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
3f60: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
3f70: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
3f80: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3f90: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
3fa0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3fb0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
3fc0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
3fd0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
3fe0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
4000: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
4010: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
4020: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
4030: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
4040: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4050: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
4060: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4080: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4090: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
40a0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
40c0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
40d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
40e0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
40f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4100: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
4110: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
4120: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
4130: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
4140: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
4150: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
4160: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
4170: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
4180: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
4190: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
41a0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
41b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
41c0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
41d0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
41e0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
41f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4200: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
4210: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
4220: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
4230: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
4240: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
4250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
4260: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
4270: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
4280: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
4290: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
42a0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
42b0: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
42c0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
42d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
42e0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
42f0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
4300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
4310: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
4320: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
4330: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
4340: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
4350: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4370: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
4380: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
4390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
43a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
43b0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
43c0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
43d0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
43e0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
43f0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
4400: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4420: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4440: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
4450: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
4460: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
4470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
44a0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
44b0: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
44c0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
44d0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
44e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
44f0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
4500: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
4510: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
4520: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
4530: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
4540: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
4550: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
4560: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
4570: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
4580: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
4590: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
45a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
45b0: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
45c0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
45d0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
45e0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
45f0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
4600: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
4610: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
4620: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
4630: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
4640: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
4650: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
4660: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
4670: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
4680: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
4690: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
46a0: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
46b0: 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49  ateBtree/BTREE_I
46c0: 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69  NTKEY and OP_Ini
46d0: 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20  tCoroutine .**  
46e0: 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45 20      (for CREATE 
46f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
4700: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
4710: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
4720: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
4730: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
4740: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
4750: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
4760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4770: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4780: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
4790: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
47a0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
47b0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
47c0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
47d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
47e0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
47f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
4800: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
4810: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4820: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
4830: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
4840: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
4850: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
4860: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
4870: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
4880: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
4890: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
48a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
48b0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
48c0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
48d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
48e0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
48f0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
4900: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
4910: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
4920: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
4930: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
4940: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
4950: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
4960: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
4970: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
4980: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
4990: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
49a0: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
49b0: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
49c0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
49d0: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 6f 70  name .     || op
49e0: 63 6f 64 65 3d 3d 4f 50 5f 56 44 65 73 74 72 6f  code==OP_VDestro
49f0: 79 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64  y.     || (opcod
4a00: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 20  e==OP_Function0 
4a10: 26 26 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63  && pOp->p4.pFunc
4a20: 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
4a30: 54 45 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c  TE_FUNC_INTERNAL
4a40: 29 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  ).     || ((opco
4a50: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
4a60: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
4a70: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
4a80: 28 28 70 4f 70 2d 3e 70 31 29 21 3d 53 51 4c 49  ((pOp->p1)!=SQLI
4a90: 54 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 32  TE_OK && pOp->p2
4aa0: 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20  ==OE_Abort)).   
4ab0: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f   ){.      hasAbo
4ac0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  rt = 1;.      br
4ad0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72  f( opcode==OP_Cr
4af0: 65 61 74 65 42 74 72 65 65 20 26 26 20 70 4f 70  eateBtree && pOp
4b00: 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b  ->p3==BTREE_INTK
4b10: 45 59 20 29 20 68 61 73 43 72 65 61 74 65 54 61  EY ) hasCreateTa
4b20: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ble = 1;.    if(
4b30: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74   opcode==OP_Init
4b40: 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49  Coroutine ) hasI
4b50: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  nitCoroutine = 1
4b60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4b70: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
4b80: 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  Y.    if( opcode
4b90: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
4ba0: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
4bb0: 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20  pOp->p2==1 ){.  
4bc0: 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72      hasFkCounter
4bd0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
4be0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
4bf0: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
4c00: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
4c10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4c20: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
4c30: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
4c40: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
4c50: 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  rred..  ** If ma
4c60: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
4c70: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
4c80: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
4c90: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
4ca0: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
4cb0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
4cc0: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
4cd0: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
4ce0: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
4cf0: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
4d00: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
4d10: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
4d20: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
4d30: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
4d40: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
4d50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
4d60: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
4d70: 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75  bort || hasFkCou
4d80: 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  nter.           
4d90: 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65     || (hasCreate
4da0: 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74  Table && hasInit
4db0: 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a  Coroutine) );.}.
4dc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4dd0: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
4de0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
4df0: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
4e00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4e10: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  DEBUG./*.** Incr
4e20: 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69 74 65  ement the nWrite
4e30: 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68 65 20   counter in the 
4e40: 56 44 42 45 20 69 66 20 74 68 65 20 63 75 72 73  VDBE if the curs
4e50: 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20  or is not an.** 
4e60: 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
4e70: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75 72 73  , or if the curs
4e80: 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  or argument is N
4e90: 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ULL..*/.void sql
4ea0: 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
4eb0: 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20 2a 70  eCounter(Vdbe *p
4ec0: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
4ed0: 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30 0a 20  ){.  if( pC==0. 
4ee0: 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72 54 79    || (pC->eCurTy
4ef0: 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52 54  pe!=CURTYPE_SORT
4f00: 45 52 0a 20 20 20 20 20 20 20 26 26 20 70 43 2d  ER.       && pC-
4f10: 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
4f20: 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20 20 20  PE_PSEUDO.      
4f30: 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68 65 6d   && !pC->isEphem
4f40: 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20 20 70  eral).  ){.    p
4f50: 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 7d 0a  ->nWrite++;.  }.
4f60: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4f70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
4f80: 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20 61 6e  .** Assert if an
4f90: 20 41 62 6f 72 74 20 61 74 20 74 68 69 73 20 70   Abort at this p
4fa0: 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d 69 67  oint in time mig
4fb0: 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ht result in a c
4fc0: 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61 62 61  orrupt.** databa
4fd0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
4fe0: 74 65 33 56 64 62 65 41 73 73 65 72 74 41 62 6f  te3VdbeAssertAbo
4ff0: 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b  rtable(Vdbe *p){
5000: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 57  .  assert( p->nW
5010: 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e 75 73  rite==0 || p->us
5020: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b  esStmtJournal );
5030: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5050: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
5060: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
5070: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49  een inserted.  I
5080: 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75  t loops.** throu
5090: 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64  gh all the opcod
50a0: 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20  es and fixes up 
50b0: 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  some details..**
50c0: 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68  .** (1) For each
50d0: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
50e0: 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76  n with a negativ
50f0: 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61  e P2 value (a la
5100: 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f  bel).**     reso
5110: 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65  lve the P2 value
5120: 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64   to an actual ad
5130: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29  dress..**.** (2)
5140: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78   Compute the max
5150: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
5160: 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79  rguments used by
5170: 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f   any SQL functio
5180: 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f  n.**     and sto
5190: 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  re that value in
51a0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a   *pMaxFuncArgs..
51b0: 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65  **.** (3) Update
51c0: 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e   the Vdbe.readOn
51d0: 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52  ly and Vdbe.bIsR
51e0: 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61  eader flags to a
51f0: 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20  ccurately.**    
5200: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
5210: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
5220: 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64  ement actually d
5230: 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49  oes..**.** (4) I
5240: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34  nitialize the p4
5250: 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  .xAdvance pointe
5260: 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61  r on opcodes tha
5270: 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  t use it..**.** 
5280: 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20  (5) Reclaim the 
5290: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
52a0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62   for storing lab
52b0: 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  els..**.** This 
52c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
52d0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65  y function corre
52e0: 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70  ctly if the mkop
52f0: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
5300: 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75  tor.** script nu
5310: 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65  mbers the opcode
5320: 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68  s correctly.  Ch
5330: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f  anges to this ro
5340: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a  utine must be.**
5350: 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74   coordinated wit
5360: 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f  h changes to mko
5370: 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73  pcodeh.tcl..*/.s
5380: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
5390: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
53a0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
53b0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d  cArgs){.  int nM
53c0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
53d0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
53e0: 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p;.  Parse *pPar
53f0: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
5400: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
5410: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a  pParse->aLabel;.
5420: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
5430: 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65  1;.  p->bIsReade
5440: 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26  r = 0;.  pOp = &
5450: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5460: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20  ;.  while(1){.. 
5470: 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20     /* Only JUMP 
5480: 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20  opcodes and the 
5490: 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70  short list of sp
54a0: 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e  ecial opcodes in
54b0: 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20   the switch.    
54c0: 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f  ** below need to
54d0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
54e0: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
54f0: 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72  cl generator scr
5500: 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a  ipt groups.    *
5510: 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f  * all these opco
5520: 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61  des together nea
5530: 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  r the front of t
5540: 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20  he opcode list. 
5550: 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79   Skip.    ** any
5560: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65   opcode that doe
5570: 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65  s not need proce
5580: 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c  ssing by virtual
5590: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
55a0: 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c  t.    ** it is l
55b0: 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
55c0: 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45  E_MX_JUMP_OPCODE
55d0: 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  , as a performan
55e0: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
55f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c  pOp->opcode<=SQL
5610: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
5620: 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  DE ){.      /* N
5630: 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20  OTE: Be sure to 
5640: 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68  update mkopcodeh
5650: 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67  .tcl when adding
5660: 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20   or removing.   
5670: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
5680: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
5690: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
56a0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
56b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
56c0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
56d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
56e0: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
56f0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
5700: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
5710: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
5720: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
5730: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20  oCommit:.       
5740: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
5750: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt: {.          
5760: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
5770: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5780: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
5790: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
57a0: 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73  _WAL.        cas
57b0: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
57c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
57d0: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
57e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
57f0: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
5800: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64           p->read
5810: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
5820: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
5830: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
5840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5850: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5860: 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20 20 63  _Next:.        c
5870: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
5880: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t: {.          p
5890: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
58a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
58b0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  xt;.          pO
58c0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
58d0: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
58e0: 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65    /* The code ge
58f0: 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f  nerator never co
5900: 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65  des any of these
5910: 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75   opcodes as a ju
5920: 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  mp.          ** 
5930: 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65  to a label.  The
5940: 79 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64  y are always cod
5950: 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63  ed as a jump bac
5960: 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20  kwards to a .   
5970: 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20         ** known 
5980: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20  address */.     
5990: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
59a0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20  ->p2>=0 );.     
59b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
59c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
59d0: 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a 20 20  se OP_Prev: {.  
59e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
59f0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
5a00: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
5a10: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
5a20: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
5a30: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  NCE;.          /
5a40: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
5a50: 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73  ator never codes
5a60: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70   any of these op
5a70: 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a  codes as a jump.
5a80: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
5a90: 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61  a label.  They a
5aa0: 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20  re always coded 
5ab0: 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61  as a jump backwa
5ac0: 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20  rds to a .      
5ad0: 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64      ** known add
5ae0: 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ress */.        
5af0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5b00: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  2>=0 );.        
5b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5b20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5b30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5b40: 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73 65  BLE.        case
5b50: 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
5b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
5b70: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
5b80: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
5b90: 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  p2;.          br
5ba0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5bb0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5bc0: 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Filter: {.      
5bd0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
5be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
5bf0: 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33  p - p->aOp) >= 3
5c00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
5c10: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
5c20: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
5c30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20   );.          n 
5c40: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
5c50: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d          if( n>nM
5c60: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
5c70: 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  s = n;.         
5c80: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
5c90: 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61 75 6c   into the defaul
5ca0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  t case */.      
5cb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
5cc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5cd0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
5ce0: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  >p2<0 ){.       
5cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
5d00: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
5d10: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
5d20: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
5d30: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20 20   only.          
5d40: 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70    ** non-jump op
5d50: 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20  codes less than 
5d60: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43  SQLITE_MX_JUMP_C
5d70: 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74 65  ODE are guarante
5d80: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
5d90: 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65    ** have non-ne
5da0: 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f  gative values fo
5db0: 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 20  r P2. */.       
5dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71       assert( (sq
5dd0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
5de0: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
5df0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
5e00: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
5e10: 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f   assert( ADDR(pO
5e20: 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65 2d 3e  p->p2)<-pParse->
5e30: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
5e40: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
5e50: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
5e60: 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  >p2)];.         
5e70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
5e80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
5ea0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5eb0: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5ec0: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5ed0: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5ee0: 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f     ** non-jump o
5ef0: 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e  pcodes less than
5f00: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
5f10: 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74  CODE are guarant
5f20: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eed to.      ** 
5f30: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5f40: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5f50: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
5f60: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
5f70: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
5f80: 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50  code]&OPFLG_JUMP
5f90: 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e  )==0 || pOp->p2>
5fa0: 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
5fb0: 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29  f( pOp==p->aOp )
5fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d   break;.    pOp-
5fd0: 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  -;.  }.  sqlite3
5fe0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
5ff0: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
6000: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
6010: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
6020: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
6030: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
6040: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
6050: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
6060: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
6070: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
6080: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6090: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
60a0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
60b0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
60c0: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
60d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
60e0: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
60f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6100: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6110: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
6120: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
6130: 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20 6c  Verify that at l
6140: 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c  east N opcode sl
6150: 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ots are availabl
6160: 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a  e in p without.*
6170: 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c  * having to mall
6180: 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63  oc for more spac
6190: 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20 63  e (except when c
61a0: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a  ompiled using.**
61b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
61c0: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54  LLOC_STRESS).  T
61d0: 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
61e0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
61f0: 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66  ting.** to verif
6200: 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 63  y that certain c
6210: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
6220: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63  dbeAddOpList() c
6230: 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c  an never.** fail
6240: 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61   due to a OOM fa
6250: 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68  ult and hence th
6260: 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  at the return va
6270: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  lue from.** sqli
6280: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6290: 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  () will always b
62a0: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23  e non-NULL..*/.#
62b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
62c0: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
62d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
62e0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
62f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6300: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
6310: 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c  equired(Vdbe *p,
6320: 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
6330: 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d  t( p->nOp + N <=
6340: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a   p->nOpAlloc );.
6350: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6360: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
6370: 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68 65  VM passed as the
6380: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 64   only argument d
6390: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
63a0: 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  ** an OP_ResultR
63b0: 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c 20  ow opcode. Fail 
63c0: 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20 69  an assert() if i
63d0: 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73 20  t does. This is 
63e0: 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65 20  used.** by code 
63f0: 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20 65  in pragma.c to e
6400: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69  nsure that the i
6410: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6420: 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61 67   certain.** prag
6430: 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69 74  mas comports wit
6440: 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65 63  h the flags spec
6450: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b 70  ified in the mkp
6460: 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a 20  ragmatab.tcl.** 
6470: 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20 64  script..*/.#if d
6480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6490: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
64a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41  (SQLITE_TEST_REA
64b0: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69  LLOC_STRESS).voi
64c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72  d sqlite3VdbeVer
64d0: 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 56  ifyNoResultRow(V
64e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
64f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6500: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
6510: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b   assert( p->aOp[
6520: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 65  i].opcode!=OP_Re
6530: 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d  sultRow );.  }.}
6540: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
6550: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61 20  enerate code (a 
6560: 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74 61  single OP_Aborta
6570: 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61 74  ble opcode) that
6580: 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79 20   will.** verify 
6590: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70 72  that the VDBE pr
65a0: 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c 79  ogram can safely
65b0: 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20 74   call Abort in t
65c0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
65d0: 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64 65  ntext..*/.#if de
65e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
65f0: 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UG).void sqlite3
6600: 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
6610: 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ble(Vdbe *p, int
6620: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66 28   onError){.  if(
6630: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
6640: 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rt ) sqlite3Vdbe
6650: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62 6f  AddOp0(p, OP_Abo
6660: 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69  rtable);.}.#endi
6670: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
6680: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
6690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
66a0: 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73  array of opcodes
66b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
66c0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73  .** the Vdbe pas
66d0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
66e0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73   argument. It is
66f0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
6700: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74  ponsibility.** t
6710: 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68  o arrange for th
6720: 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79  e returned array
6730: 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c   to be eventuall
6740: 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68  y freed using th
6750: 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70  e .** vdbeFreeOp
6760: 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e  Array() function
6770: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
6780: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20  eturning, *pnOp 
6790: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
67a0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
67b0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  in the returned.
67c0: 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20  ** array. Also, 
67d0: 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74  *pnMaxArg is set
67e0: 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f   to the larger o
67f0: 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  f its current va
6800: 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  lue and .** the 
6810: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
6820: 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70  s in the Vdbe.ap
6830: 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75  Arg[] array requ
6840: 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  ired to execute 
6850: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
6860: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62   program..*/.Vdb
6870: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6880: 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65  TakeOpArray(Vdbe
6890: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20   *p, int *pnOp, 
68a0: 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a  int *pnMaxArg){.
68b0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20    VdbeOp *aOp = 
68c0: 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->aOp;.  assert
68d0: 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d  ( aOp && !p->db-
68e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
68f0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
6900: 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  t sqlite3VdbeUse
6910: 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74  sBtree() was not
6920: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
6930: 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  VM */.  assert( 
6940: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
6950: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a  >btreeMask) );..
6960: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
6970: 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a  s(p, pnMaxArg);.
6980: 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70    *pnOp = p->nOp
6990: 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a  ;.  p->aOp = 0;.
69a0: 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a    return aOp;.}.
69b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
69c0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
69d0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
69e0: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
69f0: 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
6a00: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
6a10: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65  ed..**.** Non-ze
6a30: 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73 20  ro P2 arguments 
6a40: 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  to jump instruct
6a50: 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ions are automat
6a60: 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a  ically adjusted.
6a70: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a  ** so that the j
6a80: 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72 65  ump target is re
6a90: 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66 69  lative to the fi
6aa0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  rst operation in
6ab0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f  serted..*/.VdbeO
6ac0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 64  p *sqlite3VdbeAd
6ad0: 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dOpList(.  Vdbe 
6ae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6af0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 6f          /* Add o
6b00: 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70 72  pcodes to the pr
6b10: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20   */.  int nOp,  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6b50: 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20 2a  opcodes to add *
6b60: 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63  /.  VdbeOpList c
6b70: 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 20  onst *aOp,      
6b80: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20   /* The opcodes 
6b90: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
6ba0: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20   int iLineno    
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6bc0: 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e   Source-file lin
6bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73  e number of firs
6be0: 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  t opcode */.){. 
6bf0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
6c00: 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b   *pOut, *pFirst;
6c10: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30  .  assert( nOp>0
6c20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
6c30: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
6c40: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
6c50: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
6c60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  p->nOpAlloc && g
6c70: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f  rowOpArray(p, nO
6c80: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
6c90: 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74   0;.  }.  pFirst
6ca0: 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f   = pOut = &p->aO
6cb0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72  p[p->nOp];.  for
6cc0: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
6cd0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
6ce0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f  {.    pOut->opco
6cf0: 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65  de = aOp->opcode
6d00: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d  ;.    pOut->p1 =
6d10: 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f   aOp->p1;.    pO
6d20: 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32  ut->p2 = aOp->p2
6d30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f  ;.    assert( aO
6d40: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
6d50: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
6d60: 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e  deProperty[aOp->
6d70: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
6d80: 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d  JUMP)!=0 && aOp-
6d90: 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
6da0: 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f  Out->p2 += p->nO
6db0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  p;.    }.    pOu
6dc0: 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b  t->p3 = aOp->p3;
6dd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70  .    pOut->p4typ
6de0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6df0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
6e00: 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35   0;.    pOut->p5
6e10: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
6e20: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6e30: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
6e40: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
6e50: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
6e60: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
6e70: 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d  VERAGE.    pOut-
6e80: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
6e90: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
6ea0: 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a   (void)iLineno;.
6eb0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
6ec0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
6ed0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
6ee0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
6ef0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
6f00: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
6f10: 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c  tOp(0, i+p->nOp,
6f20: 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f   &p->aOp[i+p->nO
6f30: 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p]);.    }.#endi
6f40: 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b  f.  }.  p->nOp +
6f50: 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = nOp;.  return 
6f60: 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64  pFirst;.}..#if d
6f70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6f80: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
6f90: 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ATUS)./*.** Add 
6fa0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
6fb0: 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72  array of counter
6fc0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c  s managed by sql
6fd0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
6fe0: 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  atus()..*/.void 
6ff0: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
7000: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70  tatus(.  Vdbe *p
7010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74           /* VM t
7030: 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
7040: 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  () to */.  int a
7050: 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20  ddrExplain,     
7060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7070: 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
7080: 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20  ain (or 0) */.  
7090: 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20  int addrLoop,   
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f  /* Address of lo
70c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20  op counter */ . 
70d0: 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20   int addrVisit, 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
7100: 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e  ows visited coun
7110: 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ter */.  LogEst 
7120: 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  nEst,           
7130: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
7140: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
7150: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
7160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7170: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
7180: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
7190: 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67  e or index being
71a0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20   scanned */.){. 
71b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
71c0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
71d0: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
71e0: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
71f0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
7200: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
7210: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
7220: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
7230: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
7240: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
7250: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
7260: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
7270: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
7280: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
7290: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
72a0: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
72b0: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
72c0: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
72d0: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
72e0: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
72f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
7300: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7310: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
7320: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
7330: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
7340: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
7350: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
7360: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
7370: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
7380: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
7390: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
73a0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
73b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
73c0: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
73d0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
73e0: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
73f0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7400: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
7410: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
7420: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7430: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
7440: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
7450: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
7460: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
7470: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
7480: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7490: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
74a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
74b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
74c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
74d0: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
74e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
74f0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
7500: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
7510: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
7520: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
7530: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
7540: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7550: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
7560: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
7570: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
7580: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
75a0: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
75b0: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
75c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
75d0: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
75e0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
75f0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
7600: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
7610: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
7620: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
7630: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
7640: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7650: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
7660: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
7670: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
7680: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
7690: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
76a0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
76b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
76c0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
76d0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
76e0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
76f0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
7700: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
7710: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
7720: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7730: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
7740: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
7750: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
7760: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
7770: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
7780: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7790: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
77a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
77b0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
77c0: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
77d0: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
77e0: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
77f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7800: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
7810: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
7820: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
7830: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
7840: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
7850: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
7860: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
7870: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7880: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
7890: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
78a0: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
78b0: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
78c0: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
78d0: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
78e0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
78f0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
7900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7910: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
7920: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
7930: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
7940: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
7950: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
7960: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
7970: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
7980: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
7990: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
79a0: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
79b0: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
79c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
79d0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
79e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
79f0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
7a00: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
7a10: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
7a20: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
7a30: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
7a40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7a70: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7a80: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7a90: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7aa0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7ab0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7ac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ad0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7ae0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
7af0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
7b00: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
7b10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7b20: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
7b30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7b50: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7b60: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7b70: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7b80: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7bb0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7bc0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7bd0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7be0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7bf0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
7c00: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
7c10: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
7c20: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
7c30: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
7c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7c50: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7c60: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7c70: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7c80: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7c90: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7ca0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7cc0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7cd0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7ce0: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
7cf0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
7d00: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
7d10: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
7d20: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
7d30: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
7d40: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7d50: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7d60: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7d70: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7d80: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7d90: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7da0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7db0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7dc0: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7dd0: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7de0: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
7df0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
7e00: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
7e10: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
7e20: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
7e30: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
7e40: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7e50: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7e60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7e70: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7e80: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7e90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7ea0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7eb0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7ec0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7ed0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7ee0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7ef0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
7f00: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
7f10: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
7f20: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
7f30: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
7f40: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7f50: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7f60: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7f70: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f90: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7fa0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7fb0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7fc0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7fd0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7fe0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
7ff0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
8000: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
8010: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
8020: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
8030: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
8040: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
8050: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
8060: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
8070: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
8090: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
80a0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
80b0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
80c0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
80d0: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
80e0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
80f0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
8100: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
8110: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
8120: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
8130: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
8140: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
8150: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
8160: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
8170: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
8180: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
8190: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
81a0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
81b0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
81c0: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
81d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
81e0: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
81f0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
8200: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
8210: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
8220: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
8230: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8240: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8250: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
8260: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
8270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
8290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
82a0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
82b0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
82c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
82d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
82e0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
82f0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
8300: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
8310: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
8330: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
8340: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
8350: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
8360: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
8370: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
8380: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
8390: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
83a0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
83b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
83c0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
83d0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
83e0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
83f0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
8400: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
8410: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
8420: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
8430: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
8440: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
8450: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
8460: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
8470: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
8480: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
8490: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
84a0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
84b0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
84c0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
84d0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
84e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
84f0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
8500: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
8510: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
8520: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
8530: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
8540: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
8550: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
8560: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
8570: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
8580: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
8590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
85a0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
85b0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
85c0: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
85d0: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
85e0: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
85f0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
8600: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
8610: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
8620: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
8630: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
8640: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
8650: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
8660: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
8670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8680: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
8690: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
86a0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
86b0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
86c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
86d0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
86e0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
86f0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
8700: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
8710: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
8720: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
8730: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
8740: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
8750: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
8760: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
8770: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
8780: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
8790: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
87a0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
87b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
87c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
87d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
87e0: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
87f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8800: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8810: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
8820: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
8830: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
8840: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
8850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
8870: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
8880: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
8890: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
88a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
88b0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
88c0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
88d0: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
88e0: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
88f0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
8900: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
8910: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
8920: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
8930: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
8940: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
8950: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
8960: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
8970: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
8980: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
8990: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
89a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
89b0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
89c0: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
89d0: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
89e0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
89f0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
8a00: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
8a10: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
8a20: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
8a30: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
8a40: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8a50: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8a60: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8a70: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8a80: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8a90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8aa0: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8ab0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8ac0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8ad0: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8ae0: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
8af0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
8b00: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
8b10: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
8b20: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
8b30: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
8b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8b50: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8b60: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8b70: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8b80: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8b90: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8ba0: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8bb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8bc0: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8bd0: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8bf0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
8c00: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
8c10: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
8c20: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
8c30: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
8c40: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8c50: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8c60: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8c70: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8c80: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8c90: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8cb0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8cc0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8cd0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8ce0: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
8cf0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
8d00: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
8d10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8d20: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
8d30: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
8d40: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8d50: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8d60: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8d70: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8d80: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8d90: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8da0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8db0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8dc0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8dd0: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8de0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8df0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
8e00: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
8e10: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
8e20: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
8e30: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
8e40: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8e50: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8e60: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8e70: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8e80: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8e90: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8ea0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8eb0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8ec0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8ed0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8ee0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
8ef0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
8f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
8f10: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
8f20: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
8f30: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
8f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8f50: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8f60: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8f70: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8f80: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8f90: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8fa0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8fb0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8fc0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8fd0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8fe0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
8ff0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
9000: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
9010: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
9020: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
9030: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
9040: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
9050: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
9060: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9070: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
9080: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
9090: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
90a0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
90b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
90c0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
90d0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
90e0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
90f0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
9100: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
9110: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
9120: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
9130: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
9140: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
9150: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
9160: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
9170: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
9180: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
9190: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
91a0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
91b0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
91c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
91d0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
91e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
91f0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
9200: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
9210: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
9220: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
9230: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
9240: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
9250: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
9260: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
9270: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
9280: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
9290: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
92a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
92b0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
92c0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
92d0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
92e0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
92f0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
9300: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
9310: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9320: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
9330: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
9340: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
9350: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
9360: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
9370: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9380: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
9390: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
93a0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
93b0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
93c0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
93d0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
93e0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
93f0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
9400: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
9410: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9420: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
9430: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
9440: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
9450: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
9460: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
9470: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
9480: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
9490: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
94a0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
94b0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
94c0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
94d0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
94e0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
94f0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
9500: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
9510: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
9520: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
9530: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
9540: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
9550: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
9560: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
9570: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
9580: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9590: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
95a0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
95b0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
95c0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
95d0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
95e0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
95f0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
9600: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
9610: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
9620: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
9630: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
9640: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
9650: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
9660: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
9670: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
9680: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
9690: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
96a0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
96b0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
96c0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
96d0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
96e0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
96f0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
9700: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
9710: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
9720: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
9730: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
9740: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
9750: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
9760: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
9770: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
9780: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
9790: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
97a0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
97b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
97c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
97d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
97e0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
97f0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
9800: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
9810: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
9820: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
9830: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9840: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
9850: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
9860: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
9870: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
9880: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
9890: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
98a0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
98b0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
98c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
98d0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
98e0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
98f0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
9900: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
9910: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
9920: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
9930: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
9940: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
9950: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
9960: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
9970: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
9980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
9990: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
99a0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
99b0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
99c0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
99d0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
99e0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
99f0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
9a00: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
9a10: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
9a20: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
9a30: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
9a40: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9a50: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9a60: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9a70: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9a80: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9a90: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9aa0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9ab0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9ac0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9ad0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9ae0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
9af0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
9b00: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
9b10: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
9b20: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
9b30: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
9b40: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9b50: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9b60: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9b70: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9b80: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9b90: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9ba0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9bb0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9bc0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9bd0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9be0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
9bf0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
9c00: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
9c10: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
9c20: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
9c30: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
9c40: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9c50: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9c60: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9c70: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9c80: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9c90: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9ca0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9cb0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9cc0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9cd0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9ce0: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
9cf0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
9d00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
9d10: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
9d20: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
9d30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9d40: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9d50: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9d60: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9d70: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9d80: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9d90: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9da0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9db0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9dc0: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9dd0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9de0: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
9df0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
9e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9e10: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
9e20: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
9e30: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
9e40: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9e60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9e70: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9e80: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9e90: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9eb0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9ec0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9ed0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9ee0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
9ef0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
9f00: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
9f10: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
9f20: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
9f30: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
9f40: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9f60: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9f70: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9f80: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9f90: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9fa0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9fb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9fc0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9fd0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9fe0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
9ff0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
a000: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a010: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
a020: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
a030: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
a040: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
a050: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a060: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
a070: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
a080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
a090: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
a0a0: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
a0b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a0c0: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
a0d0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
a0e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a0f0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
a100: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
a110: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
a120: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
a130: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
a140: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
a150: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
a170: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
a180: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
a190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a1a0: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
a1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a1c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a1d0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
a1e0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
a1f0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
a200: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
a210: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
a220: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
a230: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
a240: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
a250: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
a260: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
a270: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a280: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
a290: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
a2a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a2b0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
a2c0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
a2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
a2e0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
a2f0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
a300: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
a310: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a320: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
a330: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
a340: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
a350: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
a360: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
a370: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
a380: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
a390: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
a3a0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
a3b0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
a3c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
a3d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
a3e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
a3f0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
a400: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a410: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a420: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
a430: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
a440: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
a450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
a460: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
a470: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
a480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
a490: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
a4a0: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
a4b0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
a4c0: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
a4d0: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
a4e0: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
a4f0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
a500: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
a510: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
a520: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
a530: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
a540: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
a550: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
a560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a570: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
a580: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
a590: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
a5a0: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
a5b0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a5c0: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
a5d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
a5e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a5f0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
a600: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a610: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
a620: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
a630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a640: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
a650: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a660: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
a670: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
a680: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
a690: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
a6a0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a6b0: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
a6c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
a6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
a6f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
a700: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
a710: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
a720: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a730: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
a740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a750: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a760: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
a770: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
a780: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
a790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
a7b0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
a7c0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
a7d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
a7e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
a7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a800: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
a810: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
a820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a830: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
a840: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
a850: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a860: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
a870: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
a880: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a890: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
a8a0: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
a8b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
a8c0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
a8d0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a8e0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
a8f0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
a900: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a910: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
a920: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
a930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a940: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
a950: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
a960: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a970: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
a980: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
a990: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
a9a0: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
a9b0: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
a9c0: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
a9d0: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
a9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9f0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
aa00: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
aa10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aa20: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
aa30: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
aa40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa50: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
aa60: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
aa70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
aa80: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
aa90: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
aaa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
aab0: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
aac0: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
aad0: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
aae0: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
aaf0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ab00: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
ab10: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
ab20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ab30: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
ab40: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
ab50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab60: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
ab70: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
ab80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
ab90: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
aba0: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
abb0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
abc0: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
abd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
abe0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
abf0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
ac00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ac10: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
ac20: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
ac30: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
ac40: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
ac50: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
ac60: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
ac70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
ac80: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
ac90: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
aca0: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
acb0: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
acc0: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
acd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
ace0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
acf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ad00: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
ad10: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
ad20: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
ad30: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ad40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ad50: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
ad60: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
ad70: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
ad80: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
ad90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
ada0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
adb0: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
adc0: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
add0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
ade0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
adf0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
ae00: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
ae10: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
ae20: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
ae30: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
ae40: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
ae50: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
ae60: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
ae70: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
ae80: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
ae90: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
aea0: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
aeb0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
aec0: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
aed0: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
aee0: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
aef0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
af00: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
af10: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
af20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
af30: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
af40: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
af50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
af60: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
af70: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
af80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
af90: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
afa0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
afb0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
afc0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
afd0: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
afe0: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
aff0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
b000: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
b010: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b020: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
b030: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
b040: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
b050: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
b060: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
b070: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
b080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b090: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
b0a0: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
b0b0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
b0c0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
b0d0: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
b0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b100: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
b110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b120: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
b130: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
b140: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
b150: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
b160: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
b170: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
b180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b190: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
b1a0: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
b1b0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
b1c0: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
b1d0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
b1e0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b1f0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
b200: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
b210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b220: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
b230: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
b240: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
b250: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
b260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b270: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
b280: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
b290: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
b2a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b2b0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
b2c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
b2d0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
b2e0: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
b2f0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
b300: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
b310: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
b320: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
b330: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b340: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
b350: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
b360: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
b370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b380: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
b390: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
b3a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b3b0: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
b3c0: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
b3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
b3f0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
b400: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b410: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
b420: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
b430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b440: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b460: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
b470: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
b480: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
b490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b4a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
b4b0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
b4c0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
b4d0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
b4e0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
b4f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
b500: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
b510: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
b520: 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
b530: 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20  M_IntReal) ){.  
b540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b550: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b560: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
b570: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b580: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b590: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
b5a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b5b0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31  appendf(&x, "%.1
b5c0: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
b5d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b5e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
b5f0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
b600: 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b     zP4 = "NULL";
b610: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
b630: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b640: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
b650: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
b660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b670: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b680: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b690: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
b6a0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
b6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
b6c0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
b6d0: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
b6e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b6f0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b700: 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62  "vtab:%p", pVtab
b710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b720: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b730: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
b740: 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y: {.      int i
b750: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20  ;.      int *ai 
b760: 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20  = pOp->p4.ai;.  
b770: 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30      int n = ai[0
b780: 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  ];   /* The firs
b790: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20  t element of an 
b7a0: 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77 61  INTARRAY is alwa
b7b0: 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ys the.         
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
b7d0: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
b7e0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
b7f0: 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
b800: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
b810: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
b820: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b830: 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22 2c 20  endf(&x, ",%d", 
b840: 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ai[i]);.      }.
b850: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
b860: 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69   '[';.      sqli
b870: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
b880: 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20  x, "]", 1);.    
b890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b8a0: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
b8b0: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
b8c0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b8d0: 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22  df(&x, "program"
b8e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b8f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b900: 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63  4_DYNBLOB:.    c
b910: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
b920: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
b930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
b940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b950: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
b960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b970: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 22  appendf(&x, "%s"
b980: 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e  , pOp->p4.pTab->
b990: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
b9a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b9b0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b9c0: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
b9d0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
b9e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
b9f0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
ba00: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
ba10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ba20: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
ba30: 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20  cumFinish(&x);. 
ba40: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
ba50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
ba60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
ba70: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a  E_DISPLAY_P4 */.
ba80: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
ba90: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
baa0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
bab0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
bac0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
bad0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
bae0: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
baf0: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
bb00: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
bb10: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
bb20: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
bb30: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
bb40: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
bb50: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
bb60: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
bb70: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
bb80: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
bb90: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
bba0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
bbb0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
bbc0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
bbd0: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
bbe0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
bbf0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
bc00: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
bc10: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
bc20: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
bc30: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
bc40: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
bc50: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
bc60: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44  eeMask)*8 );.  D
bc70: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65  bMaskSet(p->btre
bc80: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28  eMask, i);.  if(
bc90: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
bca0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
bcb0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
bcc0: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
bcd0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69  t(p->lockMask, i
bce0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  );.  }.}..#if !d
bcf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bd00: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
bd10: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
bd20: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
bd30: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
bd40: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
bd50: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
bd60: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
bd70: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
bd80: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
bd90: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
bda0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
bdb0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
bdc0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
bdd0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
bde0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
bdf0: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
be00: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
be10: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
be20: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
be30: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
be40: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
be50: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
be60: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
be70: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
be80: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
be90: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
bea0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
beb0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
bec0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
bed0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
bee0: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
bef0: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
bf00: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
bf10: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
bf20: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
bf30: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
bf40: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
bf50: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
bf60: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
bf70: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
bf80: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
bf90: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
bfa0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
bfb0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
bfc0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
bfd0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
bfe0: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
bff0: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
c000: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
c010: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
c020: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
c030: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
c040: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
c050: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
c060: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
c070: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
c080: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
c090: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
c0a0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
c0b0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
c0c0: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
c0d0: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
c0e0: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
c0f0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
c100: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
c110: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c120: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
c130: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
c140: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
c150: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
c160: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
c170: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
c180: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
c190: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
c1a0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
c1b0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
c1c0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
c1d0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
c1e0: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
c1f0: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
c200: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
c210: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
c220: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
c230: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
c240: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
c250: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
c260: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
c270: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c280: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
c290: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
c2a0: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
c2b0: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
c2c0: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
c2d0: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
c2e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c2f0: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74  beEnter()..*/.st
c300: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
c310: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65  LINE void vdbeLe
c320: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
c330: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
c340: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
c350: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62  .  int nDb;.  db
c360: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
c370: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
c380: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
c390: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
c3a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
c3b0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
c3c0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
c3d0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
c3e0: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
c3f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c400: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
c410: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
c420: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
c430: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
c440: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
c450: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
c460: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
c470: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76  mmon case */.  v
c480: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23  dbeLeave(p);.}.#
c490: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
c4a0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
c4b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
c4c0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
c4d0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
c4e0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
c4f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
c500: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c520: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
c530: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
c540: 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  VdbeOp *pOp){.  
c550: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
c560: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
c570: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
c580: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c590: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
c5a0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
c5b0: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
c5c0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
c5d0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
c5e0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
c5f0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
c600: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
c610: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c620: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
c630: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
c640: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
c650: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
c660: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
c670: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
c680: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
c690: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
c6a0: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
c6b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
c6c0: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
c6d0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
c6e0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
c6f0: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
c700: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
c710: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
c720: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
c730: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
c740: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
c750: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
c760: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
c770: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
c780: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
c790: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
c7a0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
c7b0: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
c7c0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
c7d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c7e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
c7f0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
c800: 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  lement..*/.stati
c810: 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72  c void initMemAr
c820: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
c830: 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  N, sqlite3 *db, 
c840: 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77 68  u16 flags){.  wh
c850: 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a  ile( (N--)>0 ){.
c860: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
c870: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66      p->flags = f
c880: 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d  lags;.    p->szM
c890: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65  alloc = 0;.#ifde
c8a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c8b0: 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d     p->pScopyFrom
c8c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
c8d0: 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   p++;.  }.}../*.
c8e0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
c8f0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
c900: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
c910: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
c920: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
c930: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
c940: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
c950: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
c960: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c970: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  >db;.    if( db-
c980: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
c990: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
c9a0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
c9b0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
c9c0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
c9d0: 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  c);.      }while
c9e0: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
c9f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ca00: 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
ca10: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
ca20: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
ca30: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20  db==p[1].db );. 
ca40: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
ca50: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
ca60: 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b  Invariants(p) );
ca70: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
ca80: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
ca90: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
caa0: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
cab0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
cac0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
cad0: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
cae0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
caf0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
cb00: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
cb10: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
cb20: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
cb30: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
cb40: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
cb50: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
cb60: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
cb70: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
cb80: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
cb90: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
cba0: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
cbb0: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
cbc0: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
cbd0: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
cbe0: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
cbf0: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
cc00: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
cc10: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
cc20: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
cc30: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
cc40: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
cc50: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
cc60: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
cc70: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
cc80: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
cc90: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
cca0: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
ccb0: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
ccc0: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
ccd0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
cce0: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
ccf0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
cd00: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
cd10: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
cd20: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
cd30: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
cd40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cd50: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
cd60: 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a  gs & MEM_Agg );.
cd70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cd80: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  p->flags & MEM_D
cd90: 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  yn );.      test
cda0: 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d 3d 73  case( p->xDel==s
cdb0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d  qlite3VdbeFrameM
cdc0: 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 69  emDel );.      i
cdd0: 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  f( p->flags&(MEM
cde0: 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b  _Agg|MEM_Dyn) ){
cdf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ce00: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
ce10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ce20: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
ce30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ce40: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
ce50: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
ce60: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
ce70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
ce80: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
ce90: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
cea0: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
ceb0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  End );.  }.}..#i
cec0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
ced0: 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  G./*.** Verify t
cee0: 68 61 74 20 70 46 72 61 6d 65 20 69 73 20 61 20  hat pFrame is a 
cef0: 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d 65 20  valid VdbeFrame 
cf00: 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75 72 6e  pointer.  Return
cf10: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 0a 2a   true if it is.*
cf20: 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 73  * and false if s
cf30: 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72 6f 6e  omething is wron
cf40: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
cf50: 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65  utine is intende
cf60: 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65  d for use inside
cf70: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
cf80: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f  tements only..*/
cf90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
cfa0: 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56 64 62  FrameIsValid(Vdb
cfb0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
cfc0: 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d 3e 69  .  if( pFrame->i
cfd0: 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51 4c 49  FrameMagic!=SQLI
cfe0: 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43 20 29  TE_FRAME_MAGIC )
cff0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
d000: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
d010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
d020: 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 20  a destructor on 
d030: 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28 77 68  a Mem object (wh
d040: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ich is really an
d050: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 29 0a   sqlite3_value).
d060: 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65 73 20  ** that deletes 
d070: 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65 63 74  the Frame object
d080: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
d090: 64 20 74 6f 20 69 74 20 61 73 20 61 20 62 6c 6f  d to it as a blo
d0a0: 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
d0b0: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64  utine does not d
d0c0: 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d 65 20  elete the Frame 
d0d0: 72 69 67 68 74 20 61 77 61 79 2e 20 20 49 74 20  right away.  It 
d0e0: 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68 65 0a  merely adds the.
d0f0: 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20 6c 69  ** frame to a li
d100: 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
d110: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
d120: 74 68 65 20 56 64 62 65 20 68 61 6c 74 73 2e 0a  the Vdbe halts..
d130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d140: 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 28 76  dbeFrameMemDel(v
d150: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 56 64  oid *pArg){.  Vd
d160: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
d170: 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29 70 41  = (VdbeFrame*)pA
d180: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rg;.  assert( sq
d190: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 73  lite3VdbeFrameIs
d1a0: 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20 29 3b  Valid(pFrame) );
d1b0: 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  .  pFrame->pPare
d1c0: 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76 2d 3e  nt = pFrame->v->
d1d0: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70 46 72  pDelFrame;.  pFr
d1e0: 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d  ame->v->pDelFram
d1f0: 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a  e = pFrame;.}...
d200: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56  /*.** Delete a V
d210: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20  dbeFrame object 
d220: 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  and its contents
d230: 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  . VdbeFrame obje
d240: 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  cts are.** alloc
d250: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50  ated by the OP_P
d260: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
d270: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
d280: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
d290: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
d2a0: 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29  te(VdbeFrame *p)
d2b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
d2c0: 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61   *aMem = VdbeFra
d2d0: 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65  meMem(p);.  Vdbe
d2e0: 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d  Cursor **apCsr =
d2f0: 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29   (VdbeCursor **)
d300: 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d  &aMem[p->nChildM
d310: 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  em];.  assert( s
d320: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
d330: 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20 20 66  sValid(p) );.  f
d340: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
d350: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
d360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d370: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
d380: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
d390: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
d3a0: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
d3b0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
d3c0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
d3d0: 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  ->v->db, &p->pAu
d3e0: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
d3f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
d400: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
d410: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d420: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
d430: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
d440: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
d450: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
d460: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
d470: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
d480: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
d490: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
d4a0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
d4b0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
d4c0: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
d4d0: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
d4e0: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
d4f0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
d500: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
d510: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
d520: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
d530: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
d540: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
d550: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
d560: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
d570: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
d580: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
d590: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
d5a0: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
d5b0: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
d5c0: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
d5d0: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
d5e0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
d5f0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
d600: 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30 34 2d  LAN..** 2018-04-
d610: 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70 6c 61  24:  In p->expla
d620: 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68 65 20  in==2 mode, the 
d630: 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 73 20  OP_Init opcodes 
d640: 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 61  of triggers.** a
d650: 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c 20 73  re also shown, s
d660: 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e 64  o that the bound
d670: 61 72 69 65 73 20 62 65 74 77 65 65 6e 20 74 68  aries between th
d680: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
d690: 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69 67 67  nd.** each trigg
d6a0: 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a 2a 2a  er are clear..**
d6b0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
d6c0: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
d6d0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
d6e0: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
d6f0: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
d700: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
d710: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
d720: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
d730: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
d740: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d760: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
d770: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
d7a0: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
d7b0: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
d7c0: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d7f0: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
d800: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
d810: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
d820: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d830: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
d840: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
d850: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
d880: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
d890: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
d8a0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d8d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d8e0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d910: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
d920: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d950: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
d960: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
d970: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
d980: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
d990: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 69  set */.  int bLi
d9a0: 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28 70 2d  stSubprogs = (p-
d9b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28  >explain==1 || (
d9c0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d9d0: 54 45 5f 54 72 69 67 67 65 72 45 51 50 29 21 3d  TE_TriggerEQP)!=
d9e0: 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20  0);.  Op *pOp = 
d9f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
da00: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
da10: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
da20: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
da30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
da40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
da50: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
da60: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
da70: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
da80: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
da90: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
daa0: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
dab0: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
dac0: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
dad0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
dae0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
daf0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
db00: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
db10: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
db20: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
db30: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
db40: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
db50: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
db60: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
db70: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
db80: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
db90: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
dba0: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
dbb0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
dbc0: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
dbd0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dbe0: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
dbf0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dc00: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
dc10: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
dc20: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
dc30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
dc40: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
dc50: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
dc60: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
dc70: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
dc80: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
dc90: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
dca0: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
dcb0: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
dcc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
dcd0: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
dce0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
dcf0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
dd00: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
dd10: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
dd20: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
dd30: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
dd40: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
dd50: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
dd60: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
dd70: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
dd80: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
dd90: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
dda0: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
ddb0: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
ddc0: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
ddd0: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
dde0: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
ddf0: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
de00: 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70  .  if( bListSubp
de10: 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rogs ){.    /* T
de20: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
de30: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
de40: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
de50: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
de60: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
de70: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
de80: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
de90: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
dea0: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
deb0: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
dec0: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
ded0: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
dee0: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
def0: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
df00: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
df10: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
df20: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
df30: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
df40: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
df50: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
df60: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
df70: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
df80: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
df90: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
dfa0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
dfb0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
dfc0: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
dfd0: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
dfe0: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
dff0: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
e000: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
e010: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
e020: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
e030: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
e040: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
e050: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
e060: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
e070: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
e080: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b    }..  while(1){
e090: 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74 73 20    /* Loop exits 
e0a0: 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20 20  via break */.   
e0b0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
e0c0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
e0d0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
e0f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
e100: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e110: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
e120: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
e130: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
e140: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
e150: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
e160: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
e170: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
e180: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
e190: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
e1a0: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
e1b0: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
e1c0: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
e1d0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
e1e0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
e1f0: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
e200: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
e210: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
e220: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
e230: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
e240: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
e250: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
e260: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
e270: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
e280: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
e290: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
e2a0: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
e2b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e    }..    /* When
e2c0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
e2d0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
e2e0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
e2f0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
e300: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
e310: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
e320: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
e330: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
e340: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 2a  ubprograms.    *
e350: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
e360: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
e370: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
e380: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
e390: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 2a 2a  ubprogram.    **
e3a0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
e3b0: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
e3c0: 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69 73 74  */.    if( bList
e3d0: 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f 70 2d  Subprogs && pOp-
e3e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
e3f0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
e400: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
e410: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
e420: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
e430: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
e440: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
e450: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e460: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
e470: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
e480: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e490: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 29 7b    if( j==nSub ){
e4a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
e4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
e4c0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
e4d0: 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20 20 20   nSub!=0);.     
e4e0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
e4f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e500: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e530: 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53 75 62   }.        apSub
e540: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
e550: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
e560: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
e570: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
e580: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70 53 75  ram;.        pSu
e590: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
e5a0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 53  Blob;.        pS
e5b0: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
e5c0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
e5d0: 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
e5e0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
e5f0: 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  am->nOp;.      }
e600: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e610: 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20 62 72  ->explain<2 ) br
e620: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  eak;.    if( pOp
e630: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70  ->opcode==OP_Exp
e640: 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  lain ) break;.  
e650: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e660: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 2d  e==OP_Init && p-
e670: 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  >pc>1 ) break;. 
e680: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
e690: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
e6a0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
e6b0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 20  rrupted ){.     
e6c0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e6d0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20  INTERRUPT;.     
e6e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e6f0: 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
e700: 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71  3VdbeError(p, sq
e710: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
e720: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
e730: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b        char *zP4;
e740: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78  .      if( p->ex
e750: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
e760: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e770: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e780: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
e790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
e7c0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
e7d0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 20  Mem++;.    .    
e7e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e7f0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
e800: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
e810: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
e820: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
e830: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
e840: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
e850: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
e860: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
e870: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
e880: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
e890: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
e8a0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
e8b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
e8c0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
e8d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
e8e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e8f0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
e900: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
e930: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
e940: 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ..      pMem->fl
e950: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e960: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e970: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
e9a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
e9b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e9c0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
e9d0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
e9e0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ea00: 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  3 */.      pMem+
ea10: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  +;..      if( sq
ea20: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
ea30: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
ea40: 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a   100) ){ /* P4 *
ea50: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ea60: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
ea70: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
ea80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ea90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
eaa0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
eab0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
eac0: 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  rm;.      zP4 = 
ead0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
eae0: 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a  Mem->z, pMem->sz
eaf0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  Malloc);.      i
eb00: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
eb10: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
eb20: 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
eb30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
eb40: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
eb50: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
eb60: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
eb70: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
eb80: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
eb90: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
eba0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ebb0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
ebc0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ebd0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
ebe0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2b     }.      pMem+
ebf0: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +;..      if( p-
ec00: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
ec10: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
ec20: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
ec30: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
ec40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
ec50: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
ec60: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
ec70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ec80: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ec90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d      }.        pM
eca0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ecb0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
ecc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
ecd0: 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  2;.        sqlit
ece0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
ecf0: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
ed00: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
ed10: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65  5 */.        pMe
ed20: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ed30: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
ed40: 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64 65  em++;.    .#ifde
ed50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ed60: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
ed70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ed80: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
ed90: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
eda0: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  500) ){.        
edb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
edc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
edd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ede0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
edf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ee00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ee10: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ee20: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ee30: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
ee40: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
ee50: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
ee60: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ee70: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
ee80: 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  se.        pMem-
ee90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
eea0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
eeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
eec0: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
eed0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
eee0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
eef0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
ef00: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 73  );.      p->pRes
ef10: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
ef20: 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 72  m[1];.      p->r
ef30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ef40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ef50: 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _ROW;.    }.  }.
ef60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ef70: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ef80: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
ef90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
efa0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
efb0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
efc0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
efd0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
efe0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
eff0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
f000: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
f010: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
f020: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
f030: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
f040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
f050: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
f060: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
f070: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
f080: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
f090: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
f0a0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
f0b0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
f0c0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
f0d0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
f0e0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
f0f0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
f100: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
f110: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
f120: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
f130: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
f140: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
f150: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
f160: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
f170: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
f180: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
f190: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
f1a0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
f1b0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
f1c0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
f1d0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
f1e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
f1f0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
f200: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
f210: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
f220: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
f230: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
f240: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
f250: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
f260: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
f270: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
f280: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
f290: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
f2a0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
f2b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
f2c0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
f2d0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
f2e0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
f2f0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
f300: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
f310: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
f320: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
f330: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
f340: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
f350: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f360: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
f370: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
f380: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
f390: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
f3a0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
f3b0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
f3c0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
f3d0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
f3e0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
f3f0: 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  E */../* An inst
f400: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
f410: 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75  ect describes bu
f420: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
f430: 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62  ble for use.** b
f440: 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20  y subcomponents 
f450: 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74  of a prepared st
f460: 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20  atement.  Space 
f470: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74  is allocated out
f480: 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c  .** of a Reusabl
f490: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79  eSpace object by
f4a0: 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28   the allocSpace(
f4b0: 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e  ) routine below.
f4c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61  .*/.struct Reusa
f4d0: 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20  bleSpace {.  u8 
f4e0: 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
f4f0: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
f500: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73 71 6c   memory */.  sql
f510: 69 74 65 33 5f 69 6e 74 36 34 20 6e 46 72 65 65  ite3_int64 nFree
f520: 3b 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20  ;   /* Bytes of 
f530: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
f540: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
f550: 74 36 34 20 6e 4e 65 65 64 65 64 3b 20 2f 2a 20  t64 nNeeded; /* 
f560: 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74  Total bytes that
f570: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
f580: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
f590: 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74  * Try to allocat
f5a0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
f5b0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
f5c0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  bulk memory for 
f5d0: 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  pBuf.** from the
f5e0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
f5f0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
f600: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
f610: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d  allocated.** mem
f620: 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ory on success. 
f630: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
f640: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
f650: 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52  able in the.** R
f660: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
f670: 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ect, increase th
f680: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e  e ReusableSpace.
f690: 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65  nNeeded.** value
f6a0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e   by the amount n
f6b0: 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eeded and return
f6c0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
f6d0: 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74  pBuf is not init
f6e0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74  ially NULL, that
f6f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
f700: 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61  memory has alrea
f710: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
f720: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
f730: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
f740: 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65  tine, so just re
f750: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
f760: 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65  f pBuf and leave
f770: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75   ReusableSpace u
f780: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
f790: 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69  This allocator i
f7a0: 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65  s employed to re
f7b0: 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73  purpose unused s
f7c0: 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20  lots at the end 
f7d0: 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  of the.** opcode
f7e0: 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72   array of prepar
f7f0: 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68  ed state for oth
f800: 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20  er memory needs 
f810: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a  of the prepared.
f820: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ** statement..*/
f830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
f840: 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75  locSpace(.  stru
f850: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
f860: 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65   *p,  /* Bulk me
f870: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
f880: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
f890: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8b0: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69  Pointer to a pri
f8c0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
f8d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
f8e0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 2f 2a 20   nByte       /* 
f8f0: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
f900: 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  needed */.){.  a
f910: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
f920: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70  E_ALIGNMENT(p->p
f930: 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20  Space) );.  if( 
f940: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  pBuf==0 ){.    n
f950: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
f960: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
f970: 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20  yte <= p->nFree 
f980: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  ){.      p->nFre
f990: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e -= nByte;.    
f9a0: 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70    pBuf = &p->pSp
f9b0: 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20  ace[p->nFree];. 
f9c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f9d0: 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42  p->nNeeded += nB
f9e0: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
f9f0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
fa00: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
fa10: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
fa20: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
fa30: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
fa40: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
fa50: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
fa60: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
fa70: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
fa80: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
fa90: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
faa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
fab0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
fac0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
fad0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
fae0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
faf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
fb00: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
fb10: 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  NIT || p->magic=
fb20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45  =VDBE_MAGIC_RESE
fb30: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
fb40: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
fb50: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
fb60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fb70: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
fb80: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
fb90: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
fba0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
fbb0: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
fbc0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
fbd0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
fbe0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
fbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
fc00: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
fc10: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
fc20: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
fc30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
fc40: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
fc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fc60: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
fc70: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
fc80: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
fc90: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
fca0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
fcb0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
fcc0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
fcd0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
fce0: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
fcf0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
fd00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
fd10: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
fd20: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
fd30: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
fd40: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
fd50: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
fd60: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
fd70: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
fd80: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
fd90: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
fda0: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
fdb0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fdc0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
fdd0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
fde0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
fdf0: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
fe00: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
fe10: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
fe20: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
fe30: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
fe40: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
fe50: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
fe60: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
fe70: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
fe80: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
fe90: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
fea0: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
feb0: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
fec0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
fed0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
fee0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
fef0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
ff00: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
ff10: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
ff20: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
ff30: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
ff40: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
ff50: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
ff60: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
ff70: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
ff80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
ff90: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
ffa0: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
ffb0: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
ffc0: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
ffd0: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
ffe0: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
fff0: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
10000 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
10010 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
10020 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
10030 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
10040 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
10050 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
10060 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
10070 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
10080 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
10090 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
100a0 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
100b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
100c0 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
100d0 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
100f0 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
10100 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10120 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10130 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
10140 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
10150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10160 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10170 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
10180 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
10190 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
101a0 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
101b0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
101e0 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
101f0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
10200 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
10210 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10220 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
10230 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
10240 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
10250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10260 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
10270 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
10280 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
102b0 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  nter */.  struct
102c0 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 78   ReusableSpace x
102d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;        /* Reus
102e0 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  able bulk memory
102f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10300 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10310 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
10320 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
10330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
10340 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
10350 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
10360 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e  ert( pParse==p->
10370 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d  pParse );.  db =
10380 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
10390 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
103a0 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
103b0 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
103c0 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
103d0 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
103e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
103f0 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
10400 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20  ->nMaxArg;.  .  
10410 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72 20 75  /* Each cursor u
10420 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ses a memory cel
10430 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20 63 75  l.  The first cu
10440 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20  rsor (cursor 0) 
10450 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65  can.  ** use aMe
10460 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f  m[0] which is no
10470 74 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 64  t otherwise used
10480 20 62 79 20 74 68 65 20 56 44 42 45 20 70 72 6f   by the VDBE pro
10490 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a  gram.  Allocate.
104a0 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68    ** space at th
104b0 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20  e end of aMem[] 
104c0 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e  for cursors 1 an
104d0 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20  d greater..  ** 
104e0 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
104f0 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
10500 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
10510 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f  or;.  if( nCurso
10520 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29  r==0 && nMem>0 )
10530 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61   nMem++;  /* Spa
10540 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65  ce for aMem[0] e
10550 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20  ven if not used 
10560 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
10570 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75  out how much reu
10580 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20  sable memory is 
10590 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65  available at the
105a0 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
105b0 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
105c0 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72  This extra memor
105d0 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f  y will be reallo
105e0 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20  cated for other 
105f0 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  elements.  ** of
10600 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
10610 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
10620 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  n = ROUND8(sizeo
10630 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20  f(Op)*p->nOp);  
10640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
10650 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d  ytes of opcode m
10660 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20  emory used */.  
10670 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28 75 38  x.pSpace = &((u8
10680 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20  *)p->aOp)[n];   
10690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
106a0 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d  nused opcode mem
106b0 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
106c0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
106d0 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20  NMENT(x.pSpace) 
106e0 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52  );.  x.nFree = R
106f0 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65  OUNDDOWN8(pParse
10700 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29  ->szOpAlloc - n)
10710 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75  ;  /* Bytes of u
10720 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  nused memory */.
10730 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65    assert( x.nFre
10740 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e>=0 );.  assert
10750 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
10760 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65  GNMENT(&x.pSpace
10770 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20  [x.nFree]) );.. 
10780 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
10790 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
107a0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
107b0 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
107c0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
107d0 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
107e0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
107f0 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
10800 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
10810 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65  = 10;.  }.  p->e
10820 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  xpired = 0;..  /
10830 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
10840 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
10850 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
10860 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
10870 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a   one or two.  **
10880 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
10890 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
108a0 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
108b0 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  sed memory at th
108c0 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
108d0 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
108e0 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
108f0 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
10900 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
10910 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
10920 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
10930 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
10940 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
10950 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
10960 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
10970 72 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  r using a fresh 
10980 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
10990 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
109a0 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
109b0 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
109c0 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
109d0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
109e0 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
109f0 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  ver memory at th
10a00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
10a10 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
10a20 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
10a30 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
10a40 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
10a50 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
10a60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10a70 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e 4e 65 65 64  ..  */.  x.nNeed
10a80 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 4d 65  ed = 0;.  p->aMe
10a90 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  m = allocSpace(&
10aa0 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  x, 0, nMem*sizeo
10ab0 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61 56  f(Mem));.  p->aV
10ac0 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
10ad0 26 78 2c 20 30 2c 20 6e 56 61 72 2a 73 69 7a 65  &x, 0, nVar*size
10ae0 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61  of(Mem));.  p->a
10af0 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
10b00 65 28 26 78 2c 20 30 2c 20 6e 41 72 67 2a 73 69  e(&x, 0, nArg*si
10b10 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 70  zeof(Mem*));.  p
10b20 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
10b30 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 43 75 72  pace(&x, 0, nCur
10b40 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
10b50 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
10b60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10b70 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
10b80 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
10b90 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 70  ocSpace(&x, 0, p
10ba0 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
10bb0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ));.#endif.  if(
10bc0 20 78 2e 6e 4e 65 65 64 65 64 20 29 7b 0a 20 20   x.nNeeded ){.  
10bd0 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e    x.pSpace = p->
10be0 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
10bf0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
10c00 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20   x.nNeeded);.   
10c10 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65   x.nFree = x.nNe
10c20 65 64 65 64 3b 0a 20 20 20 20 69 66 28 20 21 64  eded;.    if( !d
10c30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10c40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
10c50 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10c60 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  , p->aMem, nMem*
10c70 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
10c80 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
10c90 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
10ca0 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
10cb0 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70  f(Mem));.      p
10cc0 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
10cd0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72  pace(&x, p->apAr
10ce0 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
10cf0 65 6d 2a 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  em*));.      p->
10d00 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
10d10 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c  ce(&x, p->apCsr,
10d20 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
10d30 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
10d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10d50 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
10d60 54 55 53 0a 20 20 20 20 20 20 70 2d 3e 61 6e 45  TUS.      p->anE
10d70 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
10d80 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
10d90 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
10da0 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
10db0 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 56 4c 69  }.  }..  p->pVLi
10dc0 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c  st = pParse->pVL
10dd0 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  ist;.  pParse->p
10de0 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d  VList =  0;.  p-
10df0 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73  >explain = pPars
10e00 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66  e->explain;.  if
10e10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
10e20 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ed ){.    p->nVa
10e30 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43  r = 0;.    p->nC
10e40 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
10e50 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65  ->nMem = 0;.  }e
10e60 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72  lse{.    p->nCur
10e70 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
10e80 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
10e90 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e  Var)nVar;.    in
10ea0 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  itMemArray(p->aV
10eb0 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45  ar, nVar, db, ME
10ec0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  M_Null);.    p->
10ed0 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  nMem = nMem;.   
10ee0 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d   initMemArray(p-
10ef0 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c  >aMem, nMem, db,
10f00 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b   MEM_Undefined);
10f10 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
10f20 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72  pCsr, 0, nCursor
10f30 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
10f40 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51  or*));.#ifdef SQ
10f50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
10f60 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
10f70 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65 63  memset(p->anExec
10f80 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65  , 0, p->nOp*size
10f90 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66  of(i64));.#endif
10fa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
10fb0 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
10fc0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
10fd0 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
10fe0 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
10ff0 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
11000 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
11010 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
11020 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
11030 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
11040 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
11050 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
11060 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
11070 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  }.  assert( pCx-
11080 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d  >pBtx==0 || pCx-
11090 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
110a0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77  PE_BTREE );.  sw
110b0 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54  itch( pCx->eCurT
110c0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
110d0 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20  CURTYPE_SORTER: 
110e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
110f0 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
11100 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20  ->db, pCx);.    
11110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11120 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
11130 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69  BTREE: {.      i
11140 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65  f( pCx->isEpheme
11150 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ral ){.        i
11160 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29 20 73  f( pCx->pBtx ) s
11170 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
11180 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20  (pCx->pBtx);.   
11190 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d       /* The pCx-
111a0 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
111b0 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
111c0 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
111d0 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ts, by.        *
111e0 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
111f0 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  . */.      }else
11200 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11210 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  ( pCx->uc.pCurso
11220 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
11230 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
11240 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e  eCursor(pCx->uc.
11250 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
11260 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11270 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11280 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11290 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43  TABLE.    case C
112a0 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20  URTYPE_VTAB: {. 
112b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
112c0 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20  b_cursor *pVCur 
112d0 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b  = pCx->uc.pVCur;
112e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  .      const sql
112f0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
11300 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56  dule = pVCur->pV
11310 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
11320 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75      assert( pVCu
11330 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30  r->pVtab->nRef>0
11340 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d   );.      pVCur-
11350 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a  >pVtab->nRef--;.
11360 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78        pModule->x
11370 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20  Close(pVCur);.  
11380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11390 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
113a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
113b0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75  ursors in the cu
113c0 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a  rrent frame..*/.
113d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
113e0 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
113f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
11400 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
11410 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
11420 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
11430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
11440 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
11450 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
11460 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
11470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
11480 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
11490 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
114a0 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
114b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
114c0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
114d0 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
114e0 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
114f0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
11500 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
11510 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
11520 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
11530 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
11540 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
11550 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
11560 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
11570 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
11580 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
11590 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
115a0 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
115b0 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63  = pFrame->v;.  c
115c0 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
115d0 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51  me(v);.#ifdef SQ
115e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
115f0 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d  _SCANSTATUS.  v-
11600 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65  >anExec = pFrame
11610 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66  ->anExec;.#endif
11620 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
11630 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
11640 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
11650 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
11660 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
11670 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
11680 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
11690 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
116a0 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
116b0 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
116c0 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
116d0 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
116e0 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
116f0 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
11700 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62  nChange;.  v->db
11710 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
11720 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20  me->nDbChange;. 
11730 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
11740 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c  teAuxData(v->db,
11750 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &v->pAuxData, -
11760 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78  1, 0);.  v->pAux
11770 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70  Data = pFrame->p
11780 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d  AuxData;.  pFram
11790 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b  e->pAuxData = 0;
117a0 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
117b0 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
117c0 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
117d0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
117e0 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
117f0 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
11800 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
11810 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
11820 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
11830 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
11840 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
11850 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
11860 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
11870 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
11880 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
11890 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
118a0 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
118b0 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
118c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
118d0 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
118e0 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
118f0 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
11900 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
11910 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
11920 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
11930 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
11940 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
11950 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
11960 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
11970 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70  e(pFrame);.    p
11980 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
11990 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
119a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
119b0 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20  ->nFrame==0 );. 
119c0 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
119d0 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70  rame(p);.  if( p
119e0 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
119f0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
11a00 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  >aMem, p->nMem);
11a10 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
11a20 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
11a30 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
11a40 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
11a50 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
11a60 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
11a70 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
11a80 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
11a90 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
11aa0 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
11ab0 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
11ac0 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
11ad0 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61  .  if( p->pAuxDa
11ae0 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ta ) sqlite3Vdbe
11af0 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
11b00 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
11b10 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  a, -1, 0);.  ass
11b20 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
11b30 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
11b40 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
11b50 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
11b60 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
11b70 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
11b80 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
11b90 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
11ba0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
11bb0 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
11bc0 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
11bd0 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
11be0 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
11bf0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
11c00 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
11c10 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
11c20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
11c30 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
11c40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11c50 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
11c60 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
11c70 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e  Column){.  int n
11c80 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
11c90 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  = p->db;..  if( 
11ca0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 7b  p->nResColumn ){
11cb0 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
11cc0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
11cd0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
11ce0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20 20  COLNAME_N);.    
11cf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11d00 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
11d10 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f    }.  n = nResCo
11d20 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
11d30 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
11d40 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
11d50 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
11d60 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
11d70 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
11d80 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
11d90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
11da0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
11db0 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  ;.  initMemArray
11dc0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c  (p->aColName, n,
11dd0 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
11de0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11df0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
11e00 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
11e10 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11e20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
11e30 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
11e40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
11e50 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
11e60 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
11e70 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
11e80 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
11e90 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
11ea0 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
11eb0 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
11ec0 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
11ed0 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
11ee0 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
11ef0 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
11f00 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
11f10 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
11f20 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
11f30 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
11f40 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
11f50 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
11f60 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
11f70 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
11f80 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
11f90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11fa0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
11fb0 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
11fe0 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
11ff0 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
12020 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
12030 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
12040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
12060 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
12070 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
12080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
12090 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
120a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
120b0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
120c0 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
120d0 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120f0 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
12100 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
12110 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
12120 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
12130 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
12140 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
12150 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
12160 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
12170 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
12180 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12190 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
121a0 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
121b0 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
121c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
121d0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  EM_BKPT;.  }.  a
121e0 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
121f0 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
12200 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
12210 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
12220 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
12230 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
12240 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
12250 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
12260 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
12270 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
12280 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
12290 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
122a0 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
122b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
122c0 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
122d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
122e0 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
122f0 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
12300 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
12310 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
12320 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
12330 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
12340 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
12350 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
12360 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
12370 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
12380 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
12390 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
123a0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
123b0 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
123c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
123d0 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
123e0 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
123f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
12400 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
12410 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
12420 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
12430 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
12440 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
12450 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61         ** that a
12460 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
12470 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  r a two-phase co
12480 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20  mmit using a.   
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
124b0 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  l */.  int rc = 
124c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
124d0 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
124e0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
124f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12500 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
12510 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
12520 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
12530 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
12540 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
12550 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
12560 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
12570 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12580 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12590 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
125a0 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
125b0 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
125c0 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
125d0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
125e0 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
125f0 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
12600 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
12610 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
12620 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
12630 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
12640 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
12650 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
12660 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
12670 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
12680 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
12690 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
126a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
126b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
126c0 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
126d0 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
126e0 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
126f0 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
12700 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
12710 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
12720 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
12730 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
12740 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
12750 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
12760 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
12770 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
12780 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
12790 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
127a0 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
127b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
127c0 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
127d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
127e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
127f0 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
12800 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
12810 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
12820 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
12830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
12840 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
12850 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
12860 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
12870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12880 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
12890 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
128a0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
128b0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 20   database might 
128c0 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  need a master jo
128d0 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70  urnal depends up
128e0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20  on.      ** its 
128f0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d  journal mode (am
12900 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73  ong other things
12910 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78 20  ).  This matrix 
12920 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
12930 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
12940 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61  l modes use a ma
12950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
12960 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f   which do not */
12970 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
12980 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64  nst u8 aMJNeeded
12990 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
129a0 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31  * DELETE   */  1
129b0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52  ,.        /* PER
129c0 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20  SIST   */ 1,.   
129d0 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20       /* OFF     
129e0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
129f0 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20  /* TRUNCATE  */ 
12a00 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45  1,.        /* ME
12a10 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20  MORY    */ 0,.  
12a20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20        /* WAL    
12a30 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b     */ 0.      };
12a40 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
12a50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72  ager;   /* Pager
12a60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12a70 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65   pBt */.      ne
12a80 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
12a90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12aa0 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20  eEnter(pBt);.   
12ab0 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
12ac0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
12ad0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  t);.      if( db
12ae0 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f  ->aDb[i].safety_
12af0 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e  level!=PAGER_SYN
12b00 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20  CHRONOUS_OFF.   
12b10 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64      && aMJNeeded
12b20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  [sqlite3PagerGet
12b30 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
12b40 65 72 29 5d 0a 20 20 20 20 20 20 20 26 26 20 73  er)].       && s
12b50 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
12b60 64 62 28 70 50 61 67 65 72 29 3d 3d 30 0a 20 20  db(pPager)==0.  
12b70 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20      ){ .        
12b80 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a  assert( i!=1 );.
12b90 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b          nTrans++
12ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12bc0 65 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  eExclusiveLock(p
12bd0 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
12be0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
12bf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
12c00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12c10 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
12c20 66 28 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65  f( db->bConcurre
12c30 6e 74 20 26 26 20 28 72 63 20 26 20 30 78 46 46  nt && (rc & 0xFF
12c40 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  )==SQLITE_BUSY )
12c50 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 49  {.    /* An SQLI
12c60 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12c70 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
12c80 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  was encountered 
12c90 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 61 74  while .    ** at
12ca0 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61 6b 65  tempting to take
12cb0 20 74 68 65 20 57 52 49 54 45 52 20 6c 6f 63 6b   the WRITER lock
12cc0 20 6f 6e 20 61 20 77 61 6c 20 66 69 6c 65 2e 20   on a wal file. 
12cd0 52 65 6c 65 61 73 65 20 74 68 65 0a 20 20 20 20  Release the.    
12ce0 2a 2a 20 57 52 49 54 45 52 20 6c 6f 63 6b 73 20  ** WRITER locks 
12cf0 6f 6e 20 61 6c 6c 20 77 61 6c 20 66 69 6c 65 73  on all wal files
12d00 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61 72 6c   and return earl
12d10 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  y.  */.    for(i
12d20 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
12d30 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
12d40 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12d50 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12d60 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
12d70 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
12d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
12d90 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
12da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
12db0 61 67 65 72 44 72 6f 70 45 78 63 6c 75 73 69 76  agerDropExclusiv
12dc0 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72  eLock(sqlite3Btr
12dd0 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
12de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
12df0 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
12e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12e10 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
12e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12e30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12e40 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
12e50 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
12e60 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
12e70 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
12e80 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
12e90 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
12ea0 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
12eb0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
12ec0 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
12ed0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
12ee0 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
12ef0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
12f00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
12f10 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
12f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12f30 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
12f40 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
12f50 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
12f60 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
12f70 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
12f80 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
12f90 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
12fa0 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
12fb0 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
12fc0 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
12fd0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
12fe0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
12ff0 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
13000 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
13010 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
13020 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
13030 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
13040 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
13050 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
13060 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
13070 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
13080 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
13090 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
130a0 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
130b0 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
130c0 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
130d0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
130e0 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
130f0 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
13100 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
13110 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
13120 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
13130 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
13140 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
13150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
13160 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13170 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13180 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
13190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
131a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
131b0 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
131c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
131d0 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
131e0 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
131f0 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
13200 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
13210 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
13220 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
13230 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
13240 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
13250 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
13260 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
13270 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
13280 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
13290 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
132a0 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
132b0 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
132c0 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
132d0 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
132e0 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
132f0 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
13300 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
13310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13320 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
13330 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13340 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13350 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
13360 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
13370 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13380 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
13390 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
133a0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
133b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
133c0 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
133d0 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
133e0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
133f0 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
13400 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
13410 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
13420 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
13430 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
13440 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13450 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
13460 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
13470 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
13480 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
13490 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
134a0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
134b0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
134c0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
134d0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72  ->pVfs;.    char
134e0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
134f0 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
13500 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
13510 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
13520 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
13530 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
13540 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
13550 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
13560 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
13570 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
13580 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
13590 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
135a0 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
135b0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
135c0 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
135d0 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
135e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
135f0 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
13600 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
13610 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
13620 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
13630 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
13640 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
13650 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
13660 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
13670 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13680 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13690 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
136a0 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
136b0 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
136c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
136d0 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
136e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
136f0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
13700 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
13710 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
13720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13730 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
13740 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
13750 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13760 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13770 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
13780 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13790 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
137a0 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
137b0 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
137c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
137d0 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
137e0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
137f0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
13800 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
13810 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
13820 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
13830 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
13840 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
13850 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
13880 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
13890 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
138a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
138b0 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
138c0 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
138d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
138e0 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
138f0 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
13900 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
13910 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
13920 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
13930 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
13940 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
13950 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
13960 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
13970 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
13980 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
13990 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
139a0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
139b0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
139c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
139d0 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
139e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
139f0 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
13a00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
13a20 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
13a30 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
13a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13a50 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
13a60 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
13a70 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
13a80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13a90 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
13aa0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
13ab0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
13ac0 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
13ad0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
13ae0 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
13af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13b00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
13b20 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
13b30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13b40 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
13b50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
13b60 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
13b70 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
13b80 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
13b90 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
13ba0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13bb0 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
13bc0 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
13bd0 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
13be0 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
13bf0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13c00 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
13c10 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
13c20 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
13c30 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
13c40 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
13c50 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
13c60 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
13c70 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
13c80 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
13c90 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
13ca0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
13cb0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
13cc0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
13cd0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
13ce0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
13cf0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
13d00 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
13d10 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
13d20 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
13d30 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
13d40 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
13d50 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
13d60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
13d70 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
13d80 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
13d90 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
13da0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
13db0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
13dc0 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
13dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13de0 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
13df0 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
13e00 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
13e10 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
13e20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
13e30 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13e40 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
13e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13e70 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
13e80 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
13e90 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
13ea0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
13eb0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
13ec0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13ed0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
13ee0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13ef0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13f00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13f10 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
13f20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
13f30 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
13f40 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
13f50 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
13f60 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
13f70 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
13f80 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69      if( 0==(sqli
13f90 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
13fa0 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
13fb0 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
13fc0 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
13fd0 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
13fe0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
13ff0 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
14000 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
14010 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
14020 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
14030 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
14040 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
14050 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
14060 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
14070 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
14080 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
14090 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
140a0 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
140b0 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
140c0 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
140d0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
140e0 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
140f0 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
14100 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
14110 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
14120 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
14130 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
14140 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
14150 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
14160 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
14180 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
14190 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
141a0 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
141b0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
141c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
141d0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
141e0 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
141f0 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
14200 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
14210 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
14220 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
14230 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
14240 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
14250 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
14260 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
14270 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
14280 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
14290 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
142a0 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
142b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
142c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
142d0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
142e0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
142f0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
14300 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
14310 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14320 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14330 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
14340 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
14350 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
14360 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
14370 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
14380 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
14390 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
143a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
143b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
143c0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
143d0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
143e0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
143f0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
14400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14410 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
14420 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
14430 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
14440 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
14450 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
14460 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
14470 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
14480 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
14490 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
144a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
144b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
144c0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
144d0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
144e0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
144f0 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
14500 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
14510 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
14520 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
14530 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
14540 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
14550 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
14560 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
14570 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
14580 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
14590 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
145a0 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
145b0 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
145c0 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
145d0 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
145e0 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
145f0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
14600 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
14610 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
14620 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
14630 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
14640 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
14650 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
14660 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
14670 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
14680 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
14690 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
146a0 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
146b0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
146c0 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
146d0 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
146e0 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
146f0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
14700 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
14710 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14720 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
14730 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14740 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
14750 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
14760 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
14770 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
14780 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14790 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
147a0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
147b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
147c0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
147d0 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
147e0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
147f0 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
14800 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
14810 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
14820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
14830 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
14840 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
14850 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
14860 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
14870 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
14880 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
14890 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
148a0 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
148b0 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
148c0 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
148d0 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
148e0 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
148f0 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
14900 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
14910 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
14920 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
14930 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
14940 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
14950 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
14960 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
14970 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
14980 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
14990 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
149a0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
149b0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
149c0 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
149d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
149e0 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
149f0 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
14a00 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
14a10 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
14a20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
14a30 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
14a40 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
14a50 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
14a60 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
14a70 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
14a80 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
14a90 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
14aa0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
14ab0 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
14ac0 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
14ad0 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
14ae0 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
14af0 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
14b00 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
14b10 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
14b20 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
14b30 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
14b40 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
14b50 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
14b60 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
14b70 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
14b80 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
14b90 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
14ba0 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
14bb0 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
14bc0 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
14bd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
14be0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
14bf0 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
14c00 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14c10 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
14c20 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
14c30 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
14c40 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
14c50 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
14c60 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
14c70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14c80 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
14c90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
14ca0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
14cb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
14cc0 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
14cd0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
14ce0 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
14cf0 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  OK..*/.static SQ
14d00 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
14d10 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  t vdbeCloseState
14d20 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
14d30 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
14d40 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
14d50 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
14d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
14d70 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   i;.  const int 
14d80 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
14d90 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
14da0 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
14db0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14dc0 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
14dd0 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61  NT_RELEASE);.  a
14de0 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
14df0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
14e00 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
14e10 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
14e20 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
14e30 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  nt) );..  for(i=
14e40 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14e50 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 32  +){ .    int rc2
14e60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14e70 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
14e80 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
14e90 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
14ea0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
14eb0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14ec0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
14ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
14ee0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
14ef0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
14f00 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
14f10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
14f20 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
14f30 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73  .        rc2 = s
14f40 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
14f50 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
14f60 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
14f70 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
14f80 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
14f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14fa0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
14fb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14fc0 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
14fd0 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  t--;.  p->iState
14fe0 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ment = 0;..  if(
14ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15000 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  {.    if( eOp==S
15010 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15020 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
15030 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
15040 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
15050 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
15060 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
15070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15090 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
150a0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
150b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
150c0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
150d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
150e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
150f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
15100 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
15110 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
15120 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
15130 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
15140 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
15150 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
15160 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
15170 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
15180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
15190 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 69   opened.  */.  i
151a0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
151b0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
151c0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
151d0 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
151e0 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  fCons;.    db->n
151f0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
15200 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d  = p->nStmtDefImm
15210 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cons;.  }.  retu
15220 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15230 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
15240 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
15250 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28 20  int eOp){.  if( 
15260 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  p->db->nStatemen
15270 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
15280 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
15290 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d   vdbeCloseStatem
152a0 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20 7d  ent(p, eOp);.  }
152b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
152c0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
152d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
152e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
152f0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
15300 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
15310 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
15320 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
15330 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
15340 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
15350 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
15360 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
15370 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
15380 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
15390 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
153a0 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
153b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
153c0 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
153d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
153e0 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
153f0 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
15400 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
15410 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
15420 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
15430 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
15440 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
15450 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15460 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
15470 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
15480 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
15490 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
154a0 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
154b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
154c0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
154d0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
154e0 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
154f0 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
15500 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
15510 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
15520 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
15530 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
15540 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
15550 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
15560 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
15570 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
15580 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
15590 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
155a0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
155b0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
155c0 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
155d0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
155e0 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  p, "FOREIGN KEY 
155f0 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
15600 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
15610 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15620 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15630 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
15640 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15650 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
15660 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
15670 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
15680 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
15690 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
156a0 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
156b0 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
156c0 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
156d0 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
156e0 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
156f0 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
15700 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
15710 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
15720 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
15730 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
15740 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
15750 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
15760 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
15770 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
15780 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
15790 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
157a0 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
157b0 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
157c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
157d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
157e0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
157f0 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
15800 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
15810 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
15820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
15830 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
15840 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
15850 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
15860 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
15870 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
15880 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
15890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
158a0 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
158b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
158e0 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
158f0 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
15900 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
15910 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
15920 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
15930 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
15940 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
15950 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
15960 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
15970 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
15980 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
15990 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
159a0 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
159b0 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
159c0 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
159d0 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
159e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
159f0 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
15a00 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
15a10 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
15a20 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
15a30 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
15a40 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
15a50 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
15a60 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
15a70 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
15a80 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
15a90 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
15aa0 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
15ab0 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
15ac0 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
15ad0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
15ae0 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
15af0 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
15b00 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
15b10 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
15b20 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
15b30 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
15b40 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
15b50 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
15b60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15b70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
15b80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15b90 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
15ba0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
15bb0 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  PT;.  }.  closeA
15bc0 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
15bd0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
15be0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
15bf0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
15c00 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
15c10 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
15c20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
15c30 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
15c40 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
15c50 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
15c60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
15c70 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
15c80 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
15c90 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
15ca0 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
15cb0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
15cc0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
15cd0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
15ce0 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
15cf0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
15d00 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
15d10 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
15d20 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
15d30 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
15d40 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
15d50 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
15d60 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
15d70 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
15d80 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
15d90 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
15da0 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
15db0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
15dc0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
15dd0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
15de0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
15df0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
15e00 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
15e10 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
15e20 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
15e30 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
15e40 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
15e50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
15e60 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
15e70 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
15e80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
15e90 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
15ea0 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
15eb0 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
15ec0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
15ed0 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
15ee0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
15ef0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
15f00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
15f10 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
15f20 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
15f30 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
15f40 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
15f50 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
15f60 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
15f70 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
15f80 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
15f90 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
15fa0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
15fb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
15fc0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
15fd0 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
15fe0 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
15ff0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
16000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
16010 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
16020 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
16030 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
16040 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
16050 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
16060 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
16070 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
16080 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
16090 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
160a0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
160b0 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
160c0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
160d0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
160e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
160f0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
16100 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
16110 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
16120 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
16130 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
16140 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
16150 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
16160 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
16170 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
16180 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
16190 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
161a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
161b0 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
161c0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
161d0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
161e0 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
161f0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
16200 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
16210 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
16220 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
16230 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
16240 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
16250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16260 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16270 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
16280 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
16290 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
162a0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
162b0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
162c0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
162d0 20 20 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72       db->bConcur
162e0 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
162f0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16300 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
16310 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
16320 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
16330 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
16340 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
16350 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
16360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
16370 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
16380 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
16390 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
163a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163b0 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
163c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
163d0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
163e0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
163f0 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
16400 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
16410 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
16420 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
16430 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
16440 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
16450 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
16460 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
16470 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
16480 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
16490 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
164a0 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
164b0 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
164c0 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
164d0 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
164e0 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
164f0 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
16500 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
16510 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
16520 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
16530 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
16540 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16550 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
16560 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
16570 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
16580 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
16590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
165a0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
165b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
165c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
165d0 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
165e0 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
165f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16600 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
16610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
16620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
16630 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
16640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
16650 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
16660 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
16670 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
16680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
16690 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
166a0 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
166b0 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
166c0 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
166d0 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
166e0 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
166f0 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
16700 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
16710 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
16720 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
16730 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
16740 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
16750 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
16760 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
16770 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
16780 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
16790 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
167a0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
167b0 20 20 20 20 20 20 69 66 28 20 28 72 63 20 26 20        if( (rc & 
167c0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
167d0 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
167e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
167f0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
16800 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
16810 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
16820 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
16830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16840 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
16850 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16860 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
16870 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
16880 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
16890 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
168a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
168b0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
168c0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
168d0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
168e0 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
168f0 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
16900 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54 45   &= ~(u64)SQLITE
16910 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20  _DeferFKs;.     
16920 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
16930 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
16940 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
16950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16960 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
16970 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
16980 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
16990 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
169a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
169b0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
169c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
169d0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
169e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
169f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
16a00 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
16a10 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
16a20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
16a30 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
16a40 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
16a50 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
16a60 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
16a70 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
16a80 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
16a90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
16aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16ab0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
16ac0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
16ad0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
16ae0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16af0 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
16b00 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
16b10 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
16b20 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 62 43  ;.        db->bC
16b30 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20  oncurrent = 0;. 
16b40 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
16b50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
16b60 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
16b70 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
16b80 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
16b90 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
16ba0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
16bb0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
16bc0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
16bd0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
16be0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
16bf0 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
16c00 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
16c10 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
16c20 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
16c30 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
16c40 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
16c50 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
16c60 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
16c70 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
16c80 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
16c90 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
16ca0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
16cb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16cc0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
16cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16ce0 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
16cf0 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
16d00 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
16d10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
16d20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16d30 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
16d40 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
16d50 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
16d60 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
16d70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16d80 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
16d90 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
16da0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
16db0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
16dc0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
16dd0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
16de0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
16df0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
16e00 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
16e10 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
16e20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
16e30 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   1;.        db->
16e40 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b  bConcurrent = 0;
16e50 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
16e60 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
16e70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16e80 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
16e90 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
16ea0 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
16eb0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
16ec0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
16ed0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
16ee0 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
16ef0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16f00 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
16f10 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
16f20 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
16f30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
16f40 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
16f50 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
16f60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16f70 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
16f80 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
16f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16fb0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
16fc0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
16fd0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
16fe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16ff0 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
17000 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
17010 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
17020 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
17030 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
17040 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
17050 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
17060 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
17070 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
17080 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69     db->nVdbeActi
17090 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  ve--;.    if( !p
170a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d  ->readOnly ) db-
170b0 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20  >nVdbeWrite--;. 
170c0 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
170d0 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52  der ) db->nVdbeR
170e0 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ead--;.    asser
170f0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
17100 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ve>=db->nVdbeRea
17110 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
17120 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d   db->nVdbeRead>=
17130 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
17140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
17150 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20  ->nVdbeWrite>=0 
17160 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
17170 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
17180 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
17190 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
171a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
171b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
171c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
171d0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
171e0 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
171f0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
17200 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
17210 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
17220 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
17230 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
17240 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
17250 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
17260 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
17270 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
17280 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
17290 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
172a0 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
172b0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
172c0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
172d0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
172e0 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
172f0 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
17300 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
17310 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
17320 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
17330 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
17340 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
17350 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
17360 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
17370 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
17380 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
17390 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
173a0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
173b0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
173c0 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
173d0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
173e0 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
173f0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
17400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
17410 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
17420 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
17430 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
17440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
17450 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
17460 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
17470 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
17480 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
17490 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
174a0 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
174b0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
174c0 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
174d0 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
174e0 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
174f0 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
17500 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
17510 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
17520 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
17530 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
17540 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
17550 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
17560 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
17570 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
17580 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
17590 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
175a0 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
175b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
175c0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
175d0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
175e0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 64  zErrMsg ){.    d
175f0 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
17600 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ++;.    sqlite3B
17610 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
17620 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ();.    if( db->
17630 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45  pErr==0 ) db->pE
17640 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  rr = sqlite3Valu
17650 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71  eNew(db);.    sq
17660 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
17670 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
17680 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
17690 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
176a0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
176b0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
176c0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
176d0 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d  >bBenignMalloc--
176e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
176f0 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->pErr ){.    sq
17700 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e 75 6c  lite3ValueSetNul
17710 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d  l(db->pErr);.  }
17720 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d  .  db->errCode =
17730 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   rc;.  return rc
17740 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
17750 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
17760 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
17770 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
17780 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
17790 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
177a0 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
177b0 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
177c0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
177d0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
177e0 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
177f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17800 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
17810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17820 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
17830 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
17840 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
17850 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
17860 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
17870 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
17880 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
17890 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
178a0 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
178b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
178c0 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
178d0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
178e0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
178f0 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
17900 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
17910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
17920 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
17930 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
17940 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
17950 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
17960 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
17970 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
17980 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
17990 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
179a0 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
179b0 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
179c0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
179d0 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
179e0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
179f0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
17a00 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
17a10 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
17a20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
17a30 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
17a40 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
17a50 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
17a60 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
17a70 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
17a80 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
17a90 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
17aa0 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
17ab0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
17ac0 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
17ad0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
17ae0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
17af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17b00 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
17b10 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
17b20 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
17b30 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
17b40 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
17b50 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  if..  sqlite3 *d
17b60 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
17b70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
17b80 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
17b90 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
17ba0 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
17bb0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
17bc0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
17bd0 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
17be0 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
17bf0 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
17c00 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17c10 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
17c20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
17c30 61 73 20 62 65 65 6e 20 72 75 6e 20 65 76 65 6e  as been run even
17c40 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
17c50 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
17c60 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
17c70 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
17c80 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
17c90 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
17ca0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
17cb0 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
17cc0 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
17cd0 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
17ce0 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
17cf0 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
17d00 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
17d10 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
17d20 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
17d30 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
17d40 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
17d50 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
17d60 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f   ){.    vdbeInvo
17d70 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20  keSqllog(p);.   
17d80 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
17d90 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
17da0 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
17db0 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
17dc0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
17dd0 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
17de0 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
17df0 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
17e00 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
17e10 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
17e20 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
17e30 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
17e40 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
17e50 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
17e60 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
17e70 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
17e80 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
17e90 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
17ea0 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
17eb0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
17ec0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
17ed0 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73  p->rc, p->zErrMs
17ee0 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d  g ? "%s" : 0, p-
17ef0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a  >zErrMsg);.  }..
17f00 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67 69 73    /* Reset regis
17f10 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  ter contents and
17f20 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72 20 6d   reclaim error m
17f30 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e 0a 20  essage memory.. 
17f40 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17f50 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
17f60 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
17f70 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
17f80 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
17f90 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
17fa0 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
17fb0 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
17fc0 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
17fd0 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  up.  */.  if( p-
17fe0 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
17ff0 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
18000 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
18010 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
18020 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
18030 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18040 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
18050 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
18060 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
18070 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
18080 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
18090 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
180a0 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
180b0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
180c0 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66 64 65  ltSet = 0;.#ifde
180d0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
180e0 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30 3b 0a   p->nWrite = 0;.
180f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 61 76  #endif..  /* Sav
18100 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
18110 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
18120 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
18130 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
18140 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
18150 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
18160 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
18170 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
18180 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 66 70   out ){.      fp
18190 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
181a0 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
181b0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
181c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
181d0 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
181e0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
181f0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
18200 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18210 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
18220 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
18230 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
18240 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
18250 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
18260 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
18270 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
18280 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
18290 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
182a0 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
182b0 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
182c0 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
182d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
182e0 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
182f0 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
18300 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
18310 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
18320 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
18330 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
18340 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
18350 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
18360 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
18370 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
18380 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
18390 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
183a0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
183b0 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
183c0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
183d0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
183e0 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
183f0 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
18400 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
18410 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
18420 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18430 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
18440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18450 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
18460 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
18470 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
18480 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
18490 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
184a0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
184b0 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72  C_RESET;.  retur
184c0 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
184d0 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
184e0 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
184f0 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
18500 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
18510 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
18520 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
18530 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
18540 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
18550 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
18560 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
18570 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
18580 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
18590 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
185a0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
185b0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
185c0 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
185d0 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
185e0 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
185f0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
18600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18610 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
18620 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
18640 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
18650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
18660 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
18670 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
18680 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
18690 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
186a0 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
186b0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
186c0 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
186d0 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
186e0 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
186f0 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
18700 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
18710 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
18720 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
18730 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
18740 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
18750 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
18760 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
18770 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
18780 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
18790 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
187a0 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
187b0 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
187c0 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
187d0 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
187e0 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
187f0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
18800 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
18810 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
18820 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
18830 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
18840 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
18850 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
18860 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
18870 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
18880 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
18890 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
188a0 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
188b0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
188c0 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
188d0 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
188e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
188f0 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
18900 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75  (sqlite3 *db, Au
18910 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20  xData **pp, int 
18920 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
18930 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
18940 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
18950 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
18960 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
18970 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d   (pAux->iAuxOp==
18980 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20 26 26  iOp.          &&
18990 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d   pAux->iAuxArg>=
189a0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
189b0 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 33 31  pAux->iAuxArg>31
189c0 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
189d0 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 75  KBIT32(pAux->iAu
189e0 78 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  xArg)))).    ){.
189f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18a00 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33  pAux->iAuxArg==3
18a10 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
18a20 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 20  Aux->xDeleteAux 
18a30 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
18a40 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41 75 78  >xDeleteAux(pAux
18a50 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
18a60 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
18a70 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
18a80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18a90 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  (db, pAux);.    
18aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
18ab0 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78   &pAux->pNextAux
18ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18ad0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
18ae0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
18af0 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
18b00 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18b10 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
18b20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
18b30 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
18b40 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
18b50 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
18b60 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
18b70 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
18b80 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
18b90 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
18ba0 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
18bb0 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
18bc0 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
18bd0 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
18be0 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
18bf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
18c00 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
18c10 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
18c20 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
18c30 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
18c40 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
18c50 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
18c60 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
18c70 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
18c80 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
18c90 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
18ca0 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
18cb0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
18cc0 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
18cd0 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
18ce0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
18cf0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
18d00 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
18d10 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
18d20 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
18d30 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
18d40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18d50 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
18d60 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
18d70 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b  BE_MAGIC_INIT ){
18d80 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
18d90 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
18da0 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  >nVar);.    sqli
18db0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18dc0 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pVList);.    sq
18dd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18de0 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  p->pFree);.  }. 
18df0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
18e00 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
18e10 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
18e20 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
18e30 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
18e40 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
18e50 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Sql);.#ifdef SQL
18e60 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
18e70 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 62  LIZE.  sqlite3Db
18e80 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 6f 72  Free(db, p->zNor
18e90 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20 20 20 44  mSql);.  {.    D
18ea0 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 54 68 69  blquoteStr *pThi
18eb0 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 66  s, *pNext;.    f
18ec0 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70 44 62 6c  or(pThis=p->pDbl
18ed0 53 74 72 3b 20 70 54 68 69 73 3b 20 70 54 68 69  Str; pThis; pThi
18ee0 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  s=pNext){.      
18ef0 70 4e 65 78 74 20 3d 20 70 54 68 69 73 2d 3e 70  pNext = pThis->p
18f00 4e 65 78 74 53 74 72 3b 0a 20 20 20 20 20 20 73  NextStr;.      s
18f10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18f20 20 70 54 68 69 73 29 3b 0a 20 20 20 20 7d 0a 20   pThis);.    }. 
18f30 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
18f40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18f50 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
18f60 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
18f70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
18f80 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  nScan; i++){.   
18f90 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18fa0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
18fb0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
18fc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18fd0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
18fe0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
18ff0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
19000 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
19010 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
19020 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
19030 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
19040 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
19050 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
19060 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19070 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
19080 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
19090 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
190a0 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28  ct(db, p);.  if(
190b0 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
190c0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
190d0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
190e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
190f0 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
19100 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
19110 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
19120 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
19130 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
19140 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
19150 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
19160 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
19170 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
19180 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19190 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
191a0 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
191b0 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
191c0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
191d0 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
191e0 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
191f0 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
19200 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
19210 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
19220 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
19230 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
19240 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
19250 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
19260 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
19270 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
19280 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
19290 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
192a0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
192b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
192c0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
192d0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
192e0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
192f0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
19300 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
19310 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
19320 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
19330 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
19340 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
19350 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75  packed(p->uc.pCu
19360 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
19370 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
19380 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
19390 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
193a0 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
193b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
193c0 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
193d0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
193e0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
193f0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
19400 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
19410 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
19420 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
19430 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19440 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
19450 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
19460 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
19470 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
19480 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
19490 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
194a0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
194b0 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
194c0 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
194d0 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
194e0 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
194f0 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
19500 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
19510 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
19520 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
19530 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
19540 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
19550 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
19560 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
19570 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
19580 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
19590 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
195a0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
195b0 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
195c0 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
195d0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
195e0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
195f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
19600 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19610 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
19620 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72  sert( p->uc.pCur
19630 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
19640 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
19650 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
19660 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b  ->uc.pCursor) );
19670 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19680 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
19690 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  e(p->uc.pCursor,
196a0 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
196b0 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
196c0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
196d0 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
196e0 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
196f0 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
19700 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19710 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
19720 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
19730 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
19740 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
19750 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
19760 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
19770 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
19780 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
19790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
197a0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
197b0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
197c0 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
197d0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
197e0 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  REE );.  if( sql
197f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
19800 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
19810 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
19820 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
19830 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
19840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19850 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
19860 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
19870 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
19880 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
19890 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
198a0 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
198b0 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
198c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
198d0 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
198e0 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
198f0 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
19900 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
19910 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
19920 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
19930 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
19940 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
19950 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
19960 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
19970 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
19980 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
19990 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
199a0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
199b0 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
199c0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
199d0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
199e0 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
199f0 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
19a00 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
19a10 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
19a20 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
19a30 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
19a40 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
19a50 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
19a60 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
19a70 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
19a80 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
19a90 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
19aa0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
19ab0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
19ac0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
19ad0 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74  Cursor **pp, int
19ae0 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65   *piCol){.  Vdbe
19af0 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b  Cursor *p = *pp;
19b00 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
19b10 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
19b20 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75 72  BTREE || p->eCur
19b30 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53  Type==CURTYPE_PS
19b40 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20 70 2d  EUDO );.  if( p-
19b50 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
19b60 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 70 3b  ){.    int iMap;
19b70 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74  .    if( p->aAlt
19b80 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70  Map && (iMap = p
19b90 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43  ->aAltMap[1+*piC
19ba0 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  ol])>0 ){.      
19bb0 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72  *pp = p->pAltCur
19bc0 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f  sor;.      *piCo
19bd0 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20  l = iMap - 1;.  
19be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19bf0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
19c00 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
19c10 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
19c20 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
19c30 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
19c40 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
19c50 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
19c60 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
19c70 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
19c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19c90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
19ca0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
19cb0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
19cc0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
19cd0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19ce0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
19cf0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19d00 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
19d10 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
19d20 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
19d30 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
19d40 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
19d50 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
19d60 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
19d70 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
19d80 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
19d90 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
19da0 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
19db0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
19dc0 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
19dd0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
19de0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
19df0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
19e00 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
19e10 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
19e20 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
19e30 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
19e40 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
19e50 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
19e60 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
19e70 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
19e80 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
19e90 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
19ea0 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
19eb0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
19ec0 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
19ed0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
19ee0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
19ef0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
19f00 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
19f10 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
19f20 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
19f30 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
19f40 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
19f50 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
19f60 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
19f70 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
19f80 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
19f90 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
19fa0 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
19fb0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
19fc0 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
19fd0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
19fe0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
19ff0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
1a000 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
1a010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
1a020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
1a030 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
1a040 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
1a050 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
1a060 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1a070 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
1a080 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
1a090 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
1a0a0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1a0b0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
1a0c0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
1a0d0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
1a100 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
1a110 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
1a120 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
1a130 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
1a140 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
1a170 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
1a180 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
1a1a0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
1a1b0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
1a1c0 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
1a1d0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
1a1e0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
1a1f0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1a210 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
1a220 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
1a230 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
1a240 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
1a250 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
1a260 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
1a270 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
1a2a0 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
1a2b0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
1a2c0 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
1a2d0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
1a2e0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
1a2f0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
1a300 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
1a310 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
1a320 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
1a330 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
1a340 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
1a350 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
1a360 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
1a370 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
1a380 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
1a390 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
1a3a0 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
1a3b0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
1a3c0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2a  ored in pMem..**
1a3d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a3e0 20 6d 69 67 68 74 20 63 6f 6e 76 65 72 74 20 61   might convert a
1a3f0 20 6c 61 72 67 65 20 4d 45 4d 5f 49 6e 74 52 65   large MEM_IntRe
1a400 61 6c 20 76 61 6c 75 65 20 69 6e 74 6f 20 4d 45  al value into ME
1a410 4d 5f 52 65 61 6c 2e 0a 2a 2f 0a 75 33 32 20 73  M_Real..*/.u32 s
1a420 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a430 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
1a440 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  int file_format,
1a450 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69   u32 *pLen){.  i
1a460 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
1a470 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b  >flags;.  u32 n;
1a480 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e  ..  assert( pLen
1a490 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61  !=0 );.  if( fla
1a4a0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1a4b0 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
1a4c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a4d0 20 20 69 66 28 20 66 6c 61 67 73 26 28 4d 45 4d    if( flags&(MEM
1a4e0 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
1a4f0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  ) ){.    /* Figu
1a500 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
1a510 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
1a520 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
1a530 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
1a540 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
1a550 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
1a560 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
1a570 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
1a580 75 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  u;.    testcase(
1a590 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74   flags & MEM_Int
1a5a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1a5b0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ( flags & MEM_In
1a5c0 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 69 66 28  tReal );.    if(
1a5d0 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20   i<0 ){.      u 
1a5e0 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = ~i;.    }else{
1a5f0 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
1a600 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
1a610 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  27 ){.      if( 
1a620 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
1a630 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1a640 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b        *pLen = 0;
1a650 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a660 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20  8+(u32)u;.      
1a670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
1a680 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  pLen = 1;.      
1a690 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1a6a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a6b0 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70  ( u<=32767 ){ *p
1a6c0 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20  Len = 2; return 
1a6d0 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  2; }.    if( u<=
1a6e0 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e  8388607 ){ *pLen
1a6f0 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20   = 3; return 3; 
1a700 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  }.    if( u<=214
1a710 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e  7483647 ){ *pLen
1a720 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20   = 4; return 4; 
1a730 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  }.    if( u<=MAX
1a740 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20  _6BYTE ){ *pLen 
1a750 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d  = 6; return 5; }
1a760 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
1a770 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45      if( flags&ME
1a780 4d 5f 49 6e 74 52 65 61 6c 20 29 7b 0a 20 20 20  M_IntReal ){.   
1a790 20 20 20 2f 2a 20 49 66 20 74 68 65 20 76 61 6c     /* If the val
1a7a0 75 65 20 69 73 20 49 6e 74 52 65 61 6c 20 61 6e  ue is IntReal an
1a7b0 64 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 74 61  d is going to ta
1a7c0 6b 65 20 75 70 20 38 20 62 79 74 65 73 20 74 6f  ke up 8 bytes to
1a7d0 20 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20   store.      ** 
1a7e0 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  as an integer, t
1a7f0 68 65 6e 20 77 65 20 6d 69 67 68 74 20 61 73 20  hen we might as 
1a800 77 65 6c 6c 20 6d 61 6b 65 20 69 74 20 61 6e 20  well make it an 
1a810 38 2d 62 79 74 65 20 66 6c 6f 61 74 69 6e 67 0a  8-byte floating.
1a820 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 76        ** point v
1a830 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 70 4d  alue */.      pM
1a840 65 6d 2d 3e 75 2e 72 20 3d 20 28 64 6f 75 62 6c  em->u.r = (doubl
1a850 65 29 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  e)pMem->u.i;.   
1a860 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26     pMem->flags &
1a870 3d 20 7e 4d 45 4d 5f 49 6e 74 52 65 61 6c 3b 0a  = ~MEM_IntReal;.
1a880 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a890 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  s |= MEM_Real;. 
1a8a0 20 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20       return 7;. 
1a8b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1a8c0 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
1a8d0 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
1a8e0 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
1a8f0 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
1a900 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1a910 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a920 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
1a930 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
1a940 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1a950 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
1a960 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
1a970 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
1a980 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
1a990 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
1a9a0 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20  }.  *pLen = n;. 
1a9b0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
1a9c0 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
1a9d0 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
1a9e0 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
1a9f0 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  for serial types
1aa00 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a   less than 128.*
1aa10 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1aa20 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
1aa30 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
1aa40 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20        /*  0   1 
1aa50 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20    2   3   4   5 
1aa60 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20    6   7   8   9 
1aa70 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20  */   ./*   0 */ 
1aa80 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
1aa90 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c    4,  6,  8,  8,
1aaa0 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20    0,  0,./*  10 
1aab0 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
1aac0 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20   0,  1,  1,  2, 
1aad0 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20   2,  3,  3,./*  
1aae0 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20  20 */   4,  4,  
1aaf0 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20  5,  5,  6,  6,  
1ab00 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f  7,  7,  8,  8,./
1ab10 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39  *  30 */   9,  9
1ab20 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31  , 10, 10, 11, 11
1ab30 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33  , 12, 12, 13, 13
1ab40 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c  ,./*  40 */  14,
1ab50 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c   14, 15, 15, 16,
1ab60 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c   16, 17, 17, 18,
1ab70 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20   18,./*  50 */  
1ab80 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20  19, 19, 20, 20, 
1ab90 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20  21, 21, 22, 22, 
1aba0 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a  23, 23,./*  60 *
1abb0 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32  /  24, 24, 25, 2
1abc0 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32  5, 26, 26, 27, 2
1abd0 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37  7, 28, 28,./*  7
1abe0 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30  0 */  29, 29, 30
1abf0 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32  , 30, 31, 31, 32
1ac00 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a  , 32, 33, 33,./*
1ac10 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c    80 */  34, 34,
1ac20 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c   35, 35, 36, 36,
1ac30 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c   37, 37, 38, 38,
1ac40 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20  ./*  90 */  39, 
1ac50 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20  39, 40, 40, 41, 
1ac60 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20  41, 42, 42, 43, 
1ac70 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34  43,./* 100 */  4
1ac80 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34  4, 44, 45, 45, 4
1ac90 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34  6, 46, 47, 47, 4
1aca0 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f  8, 48,./* 110 */
1acb0 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30    49, 49, 50, 50
1acc0 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32  , 51, 51, 52, 52
1acd0 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30  , 53, 53,./* 120
1ace0 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c   */  54, 54, 55,
1acf0 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c   55, 56, 56, 57,
1ad00 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   57.};../*.** Re
1ad10 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
1ad20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
1ad30 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
1ad40 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
1ad50 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
1ad60 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1ad70 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
1ad80 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
1ad90 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20  erial_type>=128 
1ada0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
1adb0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1adc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1add0 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
1ade0 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20  pe<12 .         
1adf0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61     || sqlite3Sma
1ae00 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1ae10 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61  al_type]==(seria
1ae20 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29  l_type - 12)/2 )
1ae30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
1ae40 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
1ae50 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
1ae60 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65  .  }.}.u8 sqlite
1ae70 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69  3VdbeOneByteSeri
1ae80 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72  alTypeLen(u8 ser
1ae90 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73  ial_type){.  ass
1aea0 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
1aeb0 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e  <128 );.  return
1aec0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1aed0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1aee0 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pe];  .}../*.** 
1aef0 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
1af00 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
1af10 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
1af20 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
1af30 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
1af40 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
1af50 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
1af60 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
1af70 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
1af80 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1af90 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
1afa0 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
1afb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
1afc0 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
1afd0 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
1afe0 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
1aff0 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
1b000 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
1b010 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
1b020 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
1b030 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
1b040 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
1b050 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
1b060 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
1b070 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
1b080 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
1b090 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
1b0a0 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
1b0b0 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
1b0c0 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
1b0d0 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
1b0e0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
1b0f0 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
1b100 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
1b110 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
1b120 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
1b130 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
1b140 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
1b150 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
1b160 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
1b170 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
1b180 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
1b190 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
1b1a0 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
1b1b0 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
1b1c0 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
1b1d0 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
1b1e0 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
1b1f0 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
1b200 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
1b210 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
1b220 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
1b230 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
1b240 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
1b250 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1b260 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
1b270 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1b280 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
1b290 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
1b2a0 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
1b2b0 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
1b2c0 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
1b2d0 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
1b2e0 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
1b2f0 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
1b300 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
1b310 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
1b320 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
1b330 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
1b340 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
1b350 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
1b360 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
1b370 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
1b380 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
1b390 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
1b3a0 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
1b3b0 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
1b3c0 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
1b3d0 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
1b3e0 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
1b3f0 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
1b400 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
1b410 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
1b420 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
1b430 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
1b440 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
1b450 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
1b460 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
1b470 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
1b480 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
1b490 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
1b4a0 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
1b4b0 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
1b4c0 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
1b4d0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
1b4e0 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
1b4f0 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
1b500 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
1b510 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
1b520 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
1b530 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
1b540 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
1b550 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
1b560 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
1b570 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1b580 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
1b590 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
1b5a0 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
1b5b0 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
1b5c0 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
1b5d0 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
1b5e0 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
1b5f0 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
1b600 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
1b610 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
1b620 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
1b630 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
1b640 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
1b650 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
1b660 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
1b670 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
1b680 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1b690 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
1b6a0 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
1b6b0 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
1b6c0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
1b6d0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
1b6e0 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
1b6f0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1b700 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
1b710 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
1b720 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
1b730 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b740 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
1b750 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
1b760 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
1b770 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
1b780 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
1b790 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
1b7a0 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
1b7b0 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
1b7c0 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
1b7d0 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
1b7e0 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
1b7f0 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
1b800 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
1b810 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
1b820 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1b830 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1b840 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
1b850 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
1b860 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
1b870 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
1b880 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
1b890 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
1b8a0 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
1b8b0 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
1b8c0 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
1b8d0 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
1b8e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b8f0 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
1b900 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
1b910 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
1b920 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
1b930 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
1b940 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b950 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
1b960 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
1b970 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
1b980 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b990 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
1b9a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
1b9b0 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
1b9c0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
1b9d0 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
1b9e0 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
1b9f0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
1ba00 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
1ba10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
1ba20 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
1ba30 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
1ba40 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
1ba50 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1ba60 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ype];.    assert
1ba70 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
1ba80 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
1ba90 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
1baa0 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
1bab0 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
1bac0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
1bad0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
1bae0 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
1baf0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1bb00 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
1bb10 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
1bb20 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
1bb30 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
1bb40 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
1bb50 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
1bb60 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1bb70 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1bb80 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
1bb90 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c  em->n;.    if( l
1bba0 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75  en>0 ) memcpy(bu
1bbb0 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
1bbc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
1bbd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
1bbe0 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
1bbf0 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
1bc00 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20   0;.}../* Input 
1bc10 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  "x" is a sequenc
1bc20 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68  e of unsigned ch
1bc30 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65  aracters that re
1bc40 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67  present a.** big
1bc50 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
1bc60 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75    Return the equ
1bc70 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69  ivalent native i
1bc80 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  nteger.*/.#defin
1bc90 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78  e ONE_BYTE_INT(x
1bca0 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d  )    ((i8)(x)[0]
1bcb0 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59  ).#define TWO_BY
1bcc0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35  TE_INT(x)    (25
1bcd0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
1bce0 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[1]).#define T
1bcf0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29  HREE_BYTE_INT(x)
1bd00 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78    (65536*(i8)((x
1bd10 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38  )[0])|((x)[1]<<8
1bd20 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e  )|(x)[2]).#defin
1bd30 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  e FOUR_BYTE_UINT
1bd40 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b  (x)  (((u32)(x)[
1bd50 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c  0]<<24)|((x)[1]<
1bd60 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1bd70 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65  |(x)[3]).#define
1bd80 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78   FOUR_BYTE_INT(x
1bd90 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29  ) (16777216*(i8)
1bda0 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
1bdb0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
1bdc0 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a  )|(x)[3])../*.**
1bdd0 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
1bde0 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
1bdf0 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
1be00 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
1be10 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
1be20 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
1be30 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
1be40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1be50 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ytes read..**.**
1be60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1be70 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1be80 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f   two separate ro
1be90 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f  utines for perfo
1bea0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66  rmance..** The f
1beb0 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65  ew cases that re
1bec0 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69  quire local vari
1bed0 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e  ables are broken
1bee0 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61   out into a sepa
1bef0 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rate.** routine 
1bf00 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20  so that in most 
1bf10 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65  cases the overhe
1bf20 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65  ad of moving the
1bf30 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a   stack pointer.*
1bf40 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f  * is avoided..*/
1bf50 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c   .static u32 SQL
1bf60 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72  ITE_NOINLINE ser
1bf70 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
1bf80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
1bf90 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
1bfa0 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
1bfb0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
1bfc0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
1bfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
1bfe0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
1bff0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
1c000 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
1c010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
1c020 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
1c030 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
1c040 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55  ){.  u64 x = FOU
1c050 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
1c060 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52  ;.  u32 y = FOUR
1c070 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
1c080 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29  );.  x = (x<<32)
1c090 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69   + y;.  if( seri
1c0a0 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
1c0b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1c0c0 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20  : R-29851-52272 
1c0d0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1c0e0 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20  ndian 64-bit.   
1c0f0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1c100 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1c110 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1c120 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
1c130 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c140 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
1c150 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1c160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c170 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c180 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61  R-57343-49114 Va
1c190 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1c1a0 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30  ian IEEE 754-200
1c1b0 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  8 64-bit.    ** 
1c1c0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
1c1d0 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64  umber. */.#if !d
1c1e0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
1c1f0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1c200 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1c210 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65  POINT).    /* Ve
1c220 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
1c230 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
1c240 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
1c250 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
1c260 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
1c270 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
1c280 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
1c290 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
1c2a0 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
1c2b0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1c2c0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
1c2d0 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
1c2e0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
1c2f0 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
1c300 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
1c310 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
1c320 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63  <<32;.    static
1c330 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
1c340 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20   = 1.0;.    u64 
1c350 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61  t2 = t1;.    swa
1c360 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1c370 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72  t(t2);.    asser
1c380 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
1c390 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
1c3a0 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
1c3b0 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
1c3c0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
1c3d0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
1c3e0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
1c3f0 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  u.r)==8 );.    s
1c400 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1c410 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
1c420 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26  py(&pMem->u.r, &
1c430 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
1c440 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1c450 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
1c460 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e  em->u.r) ? MEM_N
1c470 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
1c480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a    }.  return 8;.
1c490 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  }.u32 sqlite3Vdb
1c4a0 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
1c4b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c4c0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1c4d0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1c4e0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1c4f0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c510 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1c520 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1c530 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c550 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1c560 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1c570 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
1c580 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1c590 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f      case 10: { /
1c5a0 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f  * Internal use o
1c5b0 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76  nly: NULL with v
1c5c0 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20  irtual table.   
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55              ** U
1c5e0 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20  PDATE no-change 
1c5f0 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20  flag set */.    
1c600 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1c610 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72  MEM_Null|MEM_Zer
1c620 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  o;.      pMem->n
1c630 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d   = 0;.      pMem
1c640 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  ->u.nZero = 0;. 
1c650 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c660 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  }.    case 11:  
1c670 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
1c680 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
1c690 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
1c6a0 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f   Null */.      /
1c6b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c6c0 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c  -24078-09375 Val
1c6d0 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f  ue is a NULL. */
1c6e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c6f0 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
1c700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c710 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  }.    case 1: {.
1c720 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1c730 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35  E-OF: R-44885-25
1c740 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20  196 Value is an 
1c750 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c  8-bit twos-compl
1c760 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69  ement.      ** i
1c770 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c780 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
1c790 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1c7a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c7b0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1c7c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1c7d0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1c7e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1c7f0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1c800 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1c810 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1c820 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1c830 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20  : R-49794-35026 
1c840 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1c850 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20  ndian 16-bit.   
1c860 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1c870 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1c880 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1c890 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
1c8a0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1c8b0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1c8c0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1c8d0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1c8e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1c8f0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
1c900 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
1c910 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1c920 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1c930 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39  ENCE-OF: R-37839
1c940 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20  -54301 Value is 
1c950 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d  a big-endian 24-
1c960 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1c970 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1c980 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1c990 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
1c9a0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1c9b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c9c0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1c9d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1c9e0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1c9f0 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
1ca00 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1ca10 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1ca20 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1ca30 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1ca40 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20  : R-01849-26079 
1ca50 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1ca60 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20  ndian 32-bit.   
1ca70 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1ca80 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1ca90 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1caa0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  i = FOUR_BYTE_IN
1cab0 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f  T(buf);.#ifdef _
1cac0 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a  _HP_cc .      /*
1cad0 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73   Work around a s
1cae0 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75  ign-extension bu
1caf0 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70  g in the HP comp
1cb00 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a  iler for HP/UX *
1cb10 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b  /.      if( buf[
1cb20 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e  0]&0x80 ) pMem->
1cb30 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66  u.i |= 0xfffffff
1cb40 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e  f80000000LL;.#en
1cb50 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  dif.      pMem->
1cb60 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1cb70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cb80 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1cb90 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
1cba0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1cbb0 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1cbc0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1cbd0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1cbe0 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39  E-OF: R-50385-09
1cbf0 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  674 Value is a b
1cc00 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74  ig-endian 48-bit
1cc10 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1cc20 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1cc30 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1cc40 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1cc50 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20  E_UINT(buf+2) + 
1cc60 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1cc70 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
1cc80 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
1cc90 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1cca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ccb0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1ccc0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
1ccd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1cce0 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
1ccf0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1cd00 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
1cd10 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
1cd20 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54  nt */.      /* T
1cd30 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76  hese use local v
1cd40 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20  ariables, so do 
1cd50 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61  them in a separa
1cd60 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  te routine.     
1cd70 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76   ** to avoid hav
1cd80 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ing to move the 
1cd90 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e  frame pointer in
1cda0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1cdb0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1cdc0 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73   serialGet(buf,s
1cdd0 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29  erial_type,pMem)
1cde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1cdf0 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
1ce00 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
1ce10 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
1ce20 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45   1 */.      /* E
1ce30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
1ce40 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20  976-22893 Value 
1ce50 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30  is the integer 0
1ce60 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  . */.      /* EV
1ce70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31  IDENCE-OF: R-181
1ce80 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69  43-12121 Value i
1ce90 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e  s the integer 1.
1cea0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1ceb0 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
1cec0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
1ced0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1cee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1cef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
1cf00 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
1cf10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1cf20 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65  4606-31564 Value
1cf30 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20   is a BLOB that 
1cf40 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65  is (N-12)/2 byte
1cf50 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  s in.      ** le
1cf60 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45  ngth..      ** E
1cf70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1cf80 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20  401-00140 Value 
1cf90 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74  is a string in t
1cfa0 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
1cfb0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e   and.      ** (N
1cfc0 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20  -13)/2 bytes in 
1cfd0 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20  length. */.     
1cfe0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
1cff0 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
1d000 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
1d010 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
1d020 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
1d030 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
1d040 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
1d050 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1d060 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
1d070 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
1d080 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
1d090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1d0a0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
1d0b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d0c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1d0d0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
1d0e0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
1d0f0 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
1d100 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
1d110 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
1d120 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
1d130 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
1d140 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1d150 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
1d160 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1d170 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
1d180 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
1d190 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
1d1a0 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
1d1b0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
1d1c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1d1d0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
1d1e0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
1d1f0 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
1d200 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
1d210 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
1d220 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
1d230 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
1d240 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
1d250 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
1d260 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
1d270 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
1d280 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
1d290 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1d2a0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
1d2b0 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
1d2c0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
1d2d0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
1d2e0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
1d2f0 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
1d300 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
1d310 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
1d320 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
1d330 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
1d340 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
1d350 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
1d360 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
1d370 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
1d380 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
1d390 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20  Info *pKeyInfo  
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d3b0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1d3c0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  he record */.){.
1d3d0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d3e0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1d3f0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
1d400 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
1d410 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d430 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d440 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
1d450 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74  for *p */.  nByt
1d460 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
1d470 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1d480 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
1d490 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  *(pKeyInfo->nKey
1d4a0 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20  Field+1);.  p = 
1d4b0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1d4c0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1d4d0 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
1d4e0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
1d4f0 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
1d500 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
1d510 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
1d520 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1d530 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
1d540 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1d550 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1d560 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
1d570 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1d580 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
1d590 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20  Info->nKeyField 
1d5a0 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1d5b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1d5c0 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1d5d0 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1d5e0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1d5f0 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1d600 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1d610 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1d620 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1d630 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1d640 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1d650 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1d660 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1d670 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1d680 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1d690 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1d6a0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1d6b0 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1d6c0 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1d6d0 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1d6e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1d6f0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1d700 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1d710 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1d720 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1d730 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1d740 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1d750 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1d760 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1d770 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1d780 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1d790 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1d7a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1d7b0 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32  ar *)pKey;.  u32
1d7c0 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1d7f0 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1d800 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1d810 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d830 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1d840 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1d850 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1d860 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1d870 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1d880 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1d890 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1d8a0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1d8b0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1d8c0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1d8d0 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1d8e0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1d8f0 73 7a 48 64 72 20 26 26 20 64 3c 3d 28 75 33 32  szHdr && d<=(u32
1d900 29 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  )nKey ){.    u32
1d910 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1d920 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1d930 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1d940 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1d950 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1d960 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1d970 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1d980 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1d990 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1d9a0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1d9b0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1d9c0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1d9d0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1d9e0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1d9f0 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
1da00 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
1da10 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1da20 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
1da30 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
1da40 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28  Mem++;.    if( (
1da50 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20  ++u)>=p->nField 
1da60 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1da70 66 28 20 64 3e 28 75 33 32 29 6e 4b 65 79 20 26  f( d>(u32)nKey &
1da80 26 20 75 20 29 7b 0a 20 20 20 20 61 73 73 65 72  & u ){.    asser
1da90 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  t( CORRUPT_DB );
1daa0 0a 20 20 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72  .    /* In a cor
1dab0 72 75 70 74 20 72 65 63 6f 72 64 20 65 6e 74 72  rupt record entr
1dac0 79 2c 20 74 68 65 20 6c 61 73 74 20 70 4d 65 6d  y, the last pMem
1dad0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
1dae0 20 73 65 74 20 75 70 20 75 73 69 6e 67 20 0a 20   set up using . 
1daf0 20 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69     ** uninitiali
1db00 7a 65 64 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72  zed memory. Over
1db10 77 72 69 74 65 20 69 74 73 20 76 61 6c 75 65 20  write its value 
1db20 77 69 74 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72  with NULL, to pr
1db30 65 76 65 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72  event.    ** war
1db40 6e 69 6e 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e  nings from MSAN.
1db50 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
1db60 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d  dbeMemSetNull(pM
1db70 65 6d 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73  em-1);.  }.  ass
1db80 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
1db90 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20  ->nKeyField + 1 
1dba0 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
1dbb0 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   u;.}..#ifdef SQ
1dbc0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1dbd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1dbe0 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65  ompares two inde
1dbf0 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72  x or table recor
1dc00 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61  d keys in the sa
1dc10 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65  me way.** as the
1dc20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1dc30 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74  rdCompare() rout
1dc40 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65  ine. Unlike Vdbe
1dc50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c  RecordCompare(),
1dc60 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1dc70 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61  n deserializes a
1dc80 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75  nd compares valu
1dc90 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  es using the.** 
1dca0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1dcb0 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
1dcc0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66  e3MemCompare() f
1dcd0 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
1dce0 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72  used.** in asser
1dcf0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
1dd00 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
1dd10 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65  e optimized code
1dd20 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   in.** sqlite3Vd
1dd30 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1dd40 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74  ) returns result
1dd50 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f  s with these two
1dd60 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a   primitives..**.
1dd70 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1dd80 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
1dd90 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71  comparison is eq
1dda0 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69  uivalent to desi
1ddb0 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65  redResult..** Re
1ddc0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68  turn false if th
1ddd0 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65  ere is a disagre
1dde0 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
1ddf0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1de00 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
1de10 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1de20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1de30 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
1de40 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
1de50 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
1de60 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1de70 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20  t desiredResult 
1de80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1de90 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f  orrect answer */
1dea0 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1deb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1dec0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1ded0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1dee0 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
1def0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
1df00 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1df10 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
1df20 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1df30 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1df40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1df50 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
1df60 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1df70 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
1df80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1df90 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1dfa0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1dfb0 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
1dfc0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1dfd0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
1dfe0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1dff0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pKeyInfo;.  if( 
1e000 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20  pKeyInfo->db==0 
1e010 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
1e020 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1e030 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
1e040 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1e050 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
1e060 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
1e070 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
1e080 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
1e090 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
1e0a0 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1e0b0 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1e0c0 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1e0d0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e0e0 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
1e0f0 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
1e100 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
1e110 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
1e120 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1e130 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
1e140 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
1e150 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
1e160 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
1e170 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
1e180 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
1e190 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
1e1a0 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
1e1b0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
1e1c0 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
1e1d0 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
1e1e0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
1e1f0 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
1e200 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
1e210 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
1e220 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
1e230 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
1e240 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
1e250 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
1e260 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
1e270 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1e280 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
1e290 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
1e2a0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
1e2b0 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
1e2c0 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
1e2d0 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
1e2e0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1e2f0 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
1e300 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1e310 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
1e320 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37  if( szHdr1>98307
1e330 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e340 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d  _CORRUPT;.  d1 =
1e350 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72   szHdr1;.  asser
1e360 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  t( pKeyInfo->nAl
1e370 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  lField>=pPKey2->
1e380 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
1e390 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1e3a0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1e3b0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1e3c0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1e3d0 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a  >nKeyField>0 );.
1e3e0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1e3f0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1e400 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1e410 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1e420 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
1e430 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
1e440 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
1e450 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
1e460 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
1e470 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
1e480 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
1e490 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
1e4a0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1e4b0 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
1e4c0 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
1e4d0 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
1e4e0 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
1e4f0 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
1e500 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
1e510 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
1e520 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
1e530 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1e540 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1e550 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
1e560 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
1e570 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
1e580 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
1e590 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
1e5a0 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
1e5b0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
1e5c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1e5d0 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
1e5e0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1e5f0 20 20 69 66 28 20 64 31 2b 28 75 36 34 29 73 65    if( d1+(u64)se
1e600 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36  rial_type1+2>(u6
1e610 34 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  4)nKey1.     && 
1e620 64 31 2b 28 75 36 34 29 73 71 6c 69 74 65 33 56  d1+(u64)sqlite3V
1e630 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1e640 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1e650 75 36 34 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u64)nKey1 .    )
1e660 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1e670 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1e680 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1e690 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1e6a0 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1e6b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e6c0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1e6d0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1e6e0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1e6f0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1e700 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1e710 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1e720 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1e730 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20  y2->aMem[i],.   
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
1e760 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20  ->nAllField>i ? 
1e770 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1e780 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
1e790 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1e7a0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1e7b0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1e7c0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1e7d0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
1e7e0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1e7f0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1e800 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
1e810 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
1e820 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
1e830 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
1e840 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
1e850 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
1e860 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
1e870 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
1e880 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1e890 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
1e8a0 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1e8b0 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1e8c0 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1e8d0 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1e8e0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1e8f0 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1e900 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1e910 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1e920 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1e930 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1e940 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1e950 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1e960 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1e970 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1e980 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1e990 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1e9a0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1e9b0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1e9c0 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1e9d0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1e9e0 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1e9f0 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1ea00 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1ea10 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1ea20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1ea30 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1ea40 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1ea50 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1ea60 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1ea70 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1ea80 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1ea90 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1eaa0 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1eab0 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1eac0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1ead0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1eae0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1eaf0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1eb00 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1eb10 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1eb20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
1eb30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1eb40 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
1eb50 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1eb60 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73   (a.k.a. columns
1eb70 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  ) in the record 
1eb80 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79  given by.** pKey
1eb90 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69  ,nKey.  The veri
1eba0 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75  fy that this cou
1ebb0 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  nt is less than 
1ebc0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a  or equal to the.
1ebd0 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62  ** limit given b
1ebe0 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  y pKeyInfo->nAll
1ebf0 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
1ec00 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
1ec10 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1ec20 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1ec30 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1ec40 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1ec50 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1ec60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1ec70 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1ec80 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1ec90 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1eca0 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1ecb0 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1ecc0 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1ecd0 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1ece0 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79  nKeyField or Key
1ecf0 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76  Info.nAllField v
1ed00 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75  alues were compu
1ed10 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  ted.** incorrect
1ed20 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1ed30 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65  id vdbeAssertFie
1ed40 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1ed50 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  its(.  int nKey,
1ed60 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1ed70 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f  y,   /* The reco
1ed80 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20  rd to verify */ 
1ed90 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
1eda0 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20   *pKeyInfo      
1edb0 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65   /* Compare size
1edc0 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e   with this KeyIn
1edd0 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  fo */.){.  int n
1ede0 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32  Field = 0;.  u32
1edf0 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64   szHdr;.  u32 id
1ee00 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64  x;.  u32 notUsed
1ee10 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1ee20 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1ee30 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1ee40 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69  char*)pKey;..  i
1ee50 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1ee60 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20  return;.  idx = 
1ee70 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1ee80 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65  , szHdr);.  asse
1ee90 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20  rt( nKey>=0 );. 
1eea0 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d   assert( szHdr<=
1eeb0 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77  (u32)nKey );.  w
1eec0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1eed0 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ){.    idx += ge
1eee0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69  tVarint32(aKey+i
1eef0 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20  dx, notUsed);.  
1ef00 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a    nField++;.  }.
1ef10 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1ef20 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41   <= pKeyInfo->nA
1ef30 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c  llField );.}.#el
1ef40 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
1ef50 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1ef60 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42  WithinLimits(A,B
1ef70 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,C).#endif../*.*
1ef80 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e  * Both *pMem1 an
1ef90 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e  d *pMem2 contain
1efa0 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20   string values. 
1efb0 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20  Compare the two 
1efc0 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20  values.** using 
1efd0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1efe0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73  quence pColl. As
1eff0 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61   usual, return a
1f000 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f   negative , zero
1f010 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1f020 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20  value if *pMem1 
1f030 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1f040 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65  ual to or greate
1f050 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d  r than .** *pMem
1f060 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  2, respectively.
1f070 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72   Similar in spir
1f080 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d  it to "rc = (*pM
1f090 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b  em1) - (*pMem2);
1f0a0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1f0b0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1f0c0 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d  tring(.  const M
1f0d0 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e  em *pMem1,.  con
1f0e0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20  st Mem *pMem2,. 
1f0f0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1f100 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63  pColl,.  u8 *prc
1f110 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Err             
1f120 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
1f130 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65  n OOM occurs, se
1f140 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1f150 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d  M */.){.  if( pM
1f160 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  em1->enc==pColl-
1f170 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54  >enc ){.    /* T
1f180 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61  he strings are a
1f190 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f  lready in the co
1f1a0 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20  rrect encoding. 
1f1b0 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a   Call the.     *
1f1c0 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  * comparison fun
1f1d0 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a  ction directly *
1f1e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f  /.    return pCo
1f1f0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1f200 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70  pUser,pMem1->n,p
1f210 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e  Mem1->z,pMem2->n
1f220 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65  ,pMem2->z);.  }e
1f230 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1f240 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
1f250 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65  *v1, *v2;.    Me
1f260 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32  m c1;.    Mem c2
1f270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f280 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d  eMemInit(&c1, pM
1f290 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1f2a0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1f2b0 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20  dbeMemInit(&c2, 
1f2c0 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1f2d0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1f2e0 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1f2f0 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20  opy(&c1, pMem1, 
1f300 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1f310 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1f320 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70  allowCopy(&c2, p
1f330 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem2, MEM_Ephem)
1f340 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74  ;.    v1 = sqlit
1f350 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1f360 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c  ite3_value*)&c1,
1f370 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1f380 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1f390 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1f3a0 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1f3b0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66  ll->enc);.    if
1f3c0 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
1f3d0 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
1f3e0 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72  prcErr ) *prcErr
1f3f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1f400 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  BKPT;.      rc =
1f410 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1f420 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d       rc = pColl-
1f430 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1f440 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32  er, c1.n, v1, c2
1f450 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20  .n, v2);.    }. 
1f460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1f470 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1f480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1f490 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1f4a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f4b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
1f4c0 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75  nput pBlob is gu
1f4d0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1f4e0 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f   Blob that is no
1f4f0 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68  t marked.** with
1f500 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75   MEM_Zero.  Retu
1f510 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f  rn true if it co
1f520 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c  uld be a zero-bl
1f530 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ob..*/.static in
1f540 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73  t isAllZero(cons
1f550 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
1f560 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1f570 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1f580 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29  {.    if( z[i] )
1f590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1f5a0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1f5b0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1f5c0 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1f5d0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1f5e0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1f5f0 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1f600 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1f610 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1f620 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1f630 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1f640 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1f650 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1f660 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1f670 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1f680 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f  ssor..*/.SQLITE_
1f690 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1f6a0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1f6b0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1f6c0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1f6d0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1f6e0 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69  n1 = pB1->n;.  i
1f6f0 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a  nt n2 = pB2->n;.
1f700 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73  .  /* It is poss
1f710 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42  ible to have a B
1f720 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68  lob value that h
1f730 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f  as some non-zero
1f740 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f   content.  ** fo
1f750 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63  llowed by zero c
1f760 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61  ontent.  But tha
1f770 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20  t only comes up 
1f780 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64  for Blobs formed
1f790 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f  .  ** by the OP_
1f7a0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1f7b0 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62  e, and such Blob
1f7c0 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73  s never get pass
1f7d0 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
1f7e0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1f7f0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
1f800 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1f810 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d  _Zero)==0 || n1=
1f820 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f830 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB2->flags & ME
1f840 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32  M_Zero)==0 || n2
1f850 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  ==0 );..  if( (p
1f860 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66  B1->flags|pB2->f
1f870 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f  lags) & MEM_Zero
1f880 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d   ){.    if( pB1-
1f890 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c  >flags & pB2->fl
1f8a0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1f8b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f8c0 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42  B1->u.nZero - pB
1f8d0 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1f8e0 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66  }else if( pB1->f
1f8f0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1f900 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
1f910 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20  AllZero(pB2->z, 
1f920 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e  pB2->n) ) return
1f930 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1f940 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d  n pB1->u.nZero -
1f950 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n2;.    }else{.
1f960 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
1f970 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31  Zero(pB1->z, pB1
1f980 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31  ->n) ) return +1
1f990 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ;.      return n
1f9a0 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  1 - pB2->u.nZero
1f9b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20  ;.    }.  }.  c 
1f9c0 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1f9d0 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f   pB2->z, n1>n2 ?
1f9e0 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28   n2 : n1);.  if(
1f9f0 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1fa00 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b   return n1 - n2;
1fa10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63  .}../*.** Do a c
1fa20 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
1fa30 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65  n a 64-bit signe
1fa40 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20  d integer and a 
1fa50 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d  64-bit floating-
1fa60 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e  point.** number.
1fa70 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1fa80 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1fa90 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1faa0 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20  t (i64) is less 
1fab0 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74  than,.** equal t
1fac0 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1fad0 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64  an the second (d
1fae0 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  ouble)..*/.stati
1faf0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74  c int sqlite3Int
1fb00 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34  FloatCompare(i64
1fb10 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20   i, double r){. 
1fb20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47   if( sizeof(LONG
1fb30 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29  DOUBLE_TYPE)>8 )
1fb40 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45  {.    LONGDOUBLE
1fb50 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44  _TYPE x = (LONGD
1fb60 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20  OUBLE_TYPE)i;.  
1fb70 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75    if( x<r ) retu
1fb80 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78  rn -1;.    if( x
1fb90 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1fba0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1fbb0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79  }else{.    i64 y
1fbc0 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a  ;.    double s;.
1fbd0 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33      if( r<-92233
1fbe0 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1fbf0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1fc00 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32    if( r>=9223372
1fc10 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1fc20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1fc30 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20  y = (i64)r;.    
1fc40 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e  if( i<y ) return
1fc50 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79   -1;.    if( i>y
1fc60 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1fc70 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b    s = (double)i;
1fc80 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72  .    if( s<r ) r
1fc90 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1fca0 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( s>r ) return +
1fcb0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1fcc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1fcd0 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1fce0 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1fcf0 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1fd00 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1fd10 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1fd20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1fd30 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1fd40 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1fd50 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1fd60 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1fd70 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1fd80 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1fd90 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1fda0 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1fdb0 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1fdc0 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1fdd0 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1fde0 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1fdf0 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1fe00 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1fe10 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1fe20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1fe30 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1fe40 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1fe50 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1fe60 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1fe70 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1fe80 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1fe90 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1fea0 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1feb0 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1fec0 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1fed0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1fee0 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1fef0 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1ff00 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1ff10 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1ff20 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73  f2;.  assert( !s
1ff30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
1ff40 6f 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20  owSet(pMem1) && 
1ff50 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49  !sqlite3VdbeMemI
1ff60 73 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29  sRowSet(pMem2) )
1ff70 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1ff80 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1ff90 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1ffa0 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1ffb0 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1ffc0 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1ffd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1ffe0 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1fff0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
20000 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
20010 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
20020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c  ;.  }..  /* At l
20030 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
20040 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20  two values is a 
20050 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66  number.  */.  if
20060 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
20070 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
20080 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20  al|MEM_IntReal) 
20090 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  ){.    testcase(
200a0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
200b0 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
200c0 20 74 65 73 74 63 61 73 65 28 20 63 6f 6d 62 69   testcase( combi
200d0 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
200e0 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
200f0 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f 66  case( combined_f
20100 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65  lags & MEM_IntRe
20110 61 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  al );.    if( (f
20120 31 20 26 20 66 32 20 26 20 28 4d 45 4d 5f 49 6e  1 & f2 & (MEM_In
20130 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21  t|MEM_IntReal))!
20140 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
20150 63 61 73 65 28 20 66 31 20 26 20 66 32 20 26 20  case( f1 & f2 & 
20160 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
20170 20 74 65 73 74 63 61 73 65 28 20 66 31 20 26 20   testcase( f1 & 
20180 66 32 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  f2 & MEM_IntReal
20190 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   );.      if( pM
201a0 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
201b0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
201c0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
201d0 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
201e0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
201f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
20200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20210 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
20220 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
20230 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
20240 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
20250 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
20260 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
20270 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
20280 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
20290 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
202a0 20 20 20 69 66 28 20 28 66 31 26 28 4d 45 4d 5f     if( (f1&(MEM_
202b0 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29  Int|MEM_IntReal)
202c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
202d0 73 74 63 61 73 65 28 20 66 31 20 26 20 4d 45 4d  stcase( f1 & MEM
202e0 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65  _Int );.      te
202f0 73 74 63 61 73 65 28 20 66 31 20 26 20 4d 45 4d  stcase( f1 & MEM
20300 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20  _IntReal );.    
20310 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
20320 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
20330 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20340 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
20350 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem1->u.i, pMem
20360 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  2->u.r);.      }
20370 65 6c 73 65 20 69 66 28 20 28 66 32 26 28 4d 45  else if( (f2&(ME
20380 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61  M_Int|MEM_IntRea
20390 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  l))!=0 ){.      
203a0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
203b0 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
203c0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
203d0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
203e0 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
203f0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
20400 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20420 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
20430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20440 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
20450 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
20460 28 20 28 66 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d  ( (f2&(MEM_Int|M
20470 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30 20  EM_IntReal))!=0 
20480 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
20490 61 73 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e  ase( f2 & MEM_In
204a0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
204b0 74 63 61 73 65 28 20 66 32 20 26 20 4d 45 4d 5f  tcase( f2 & MEM_
204c0 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  IntReal );.     
204d0 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74     return -sqlit
204e0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
204f0 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d  e(pMem2->u.i, pM
20500 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em1->u.r);.     
20510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20520 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
20530 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
20540 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f  urn +1;.  }..  /
20550 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
20560 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
20570 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
20580 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
20590 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
205a0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
205b0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
205c0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
205d0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
205e0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
205f0 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
20600 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
20610 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
20620 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20630 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
20640 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
20650 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
20660 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
20670 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
20680 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d  em2->enc || pMem
20690 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1->db->mallocFai
206a0 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  led );.    asser
206b0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  t( pMem1->enc==S
206c0 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20  QLITE_UTF8 || . 
206d0 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31             pMem1
206e0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
206f0 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e  F16LE || pMem1->
20700 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
20710 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  6BE );..    /* T
20720 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
20730 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65  uence must be de
20740 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f  fined at this po
20750 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  int, even if.   
20760 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c   ** the user del
20770 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  etes the collati
20780 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65  on sequence afte
20790 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  r the vdbe progr
207a0 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d  am is.    ** com
207b0 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20  piled (this was 
207c0 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63  not always the c
207d0 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ase)..    */.   
207e0 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20   assert( !pColl 
207f0 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  || pColl->xCmp )
20800 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ;..    if( pColl
20810 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20820 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
20830 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65  tring(pMem1, pMe
20840 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20  m2, pColl, 0);. 
20850 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
20860 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61   NULL pointer wa
20870 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
20880 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e  collate function
20890 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20  , fall through. 
208a0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f     ** to the blo
208b0 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d  b case and use m
208c0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d  emcmp().  */.  }
208d0 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c  . .  /* Both val
208e0 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62  ues must be blob
208f0 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e  s.  Compare usin
20900 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  g memcmp().  */.
20910 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20920 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d  BlobCompare(pMem
20930 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f  1, pMem2);.}.../
20940 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
20950 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
20960 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
20970 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
20980 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
20990 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
209a0 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
209b0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
209c0 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
209d0 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
209e0 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
209f0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
20a00 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
20a10 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
20a20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
20a30 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
20a40 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
20a50 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
20a60 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
20a70 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
20a80 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
20a90 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
20aa0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
20ab0 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
20ac0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
20ad0 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
20ae0 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
20af0 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
20b00 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
20b10 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
20b20 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
20b30 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
20b40 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
20b50 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
20b60 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
20b70 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20b80 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
20b90 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
20ba0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
20bb0 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
20bc0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
20bd0 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
20be0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
20bf0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
20c00 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
20c10 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
20c20 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
20c30 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
20c40 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
20c50 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
20c60 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
20c70 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
20c80 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
20c90 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
20ca0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
20cb0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
20cc0 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
20cd0 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
20ce0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
20cf0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
20d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20d10 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
20d20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
20d30 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20d40 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
20d50 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
20d60 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
20d70 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20d80 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
20d90 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
20da0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
20db0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
20dc0 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
20dd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20de0 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
20df0 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
20e00 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
20e10 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
20e20 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
20e30 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
20e40 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
20e50 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
20e60 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
20e70 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
20e80 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
20e90 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
20ea0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
20eb0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
20ec0 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
20ed0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f  created by the O
20ee0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
20ef0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
20f00 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
20f10 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
20f20 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
20f30 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
20f40 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
20f50 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
20f60 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
20f70 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
20f80 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
20f90 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
20fa0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
20fb0 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
20fc0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
20fd0 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
20fe0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
20ff0 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
21000 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
21010 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
21020 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
21030 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
21040 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
21050 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
21060 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
21070 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
21080 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
21090 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
210a0 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
210b0 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
210c0 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20  >errCode to .** 
210d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
210e0 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20  nd return 0. If 
210f0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
21100 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a  encountered, .**
21110 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
21120 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
21130 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20  E_NOMEM and, if 
21140 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
21150 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61  the.** malloc-fa
21160 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e  iled flag set on
21170 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
21180 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e   (pPKey2->pKeyIn
21190 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20  fo->db)..*/.int 
211a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
211b0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
211c0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
211d0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
211e0 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
211f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
21200 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20  ord *pPKey2,    
21210 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
21220 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
21250 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
21260 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
21270 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
212a0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
212b0 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
212c0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
212f0 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
21300 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
21310 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
21320 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21330 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
21340 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
21350 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21370 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
21380 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
21390 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
213c0 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
213d0 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
213e0 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
213f0 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
21400 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
21410 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
21420 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
21430 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
21440 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
21450 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
21460 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
21470 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
21480 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
21490 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
214a0 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
214b0 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
214c0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
214d0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
214e0 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
214f0 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
21500 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
21510 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
21520 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
21530 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
21540 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
21550 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
21560 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
21570 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
21580 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
21590 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
215a0 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
215b0 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
215c0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
215d0 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
215e0 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
215f0 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
21600 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
21610 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
21620 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
21630 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66   i = 0;.  }.  if
21640 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
21650 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 70 50 4b  Key1 ){ .    pPK
21660 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
21670 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
21680 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
21690 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
216a0 74 69 6f 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56  tion */.  }..  V
216b0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
216c0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
216d0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
216e0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
216f0 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
21700 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
21710 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
21720 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20  Key2->nField .  
21730 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
21740 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
21750 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
21760 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
21770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
21780 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
21790 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
217a0 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
217b0 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
217c0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
217d0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
217e0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
217f0 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
21800 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
21810 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
21820 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20  _IntReal) ){.   
21830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 68     testcase( pRh
21840 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
21850 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  nt );.      test
21860 63 61 73 65 28 20 70 52 68 73 2d 3e 66 6c 61 67  case( pRhs->flag
21870 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20  s & MEM_IntReal 
21880 29 3b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  );.      serial_
21890 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
218a0 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
218b0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
218c0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
218d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
218e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
218f0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
21900 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21910 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
21920 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
21930 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
21940 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
21950 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
21960 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
21970 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
21980 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
21990 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74  rc = -sqlite3Int
219a0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68  FloatCompare(pRh
219b0 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72  s->u.i, mem1.u.r
219c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
219d0 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
219e0 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
219f0 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
21a00 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
21a10 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
21a20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
21a30 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
21a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21a50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
21a60 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
21a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21a80 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
21a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21aa0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
21ab0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
21ac0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
21ad0 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
21ae0 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
21af0 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
21b00 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
21b10 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
21b20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
21b30 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
21b40 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
21b50 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
21b60 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
21b70 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
21b80 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
21b90 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
21ba0 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
21bb0 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
21bc0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
21bd0 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
21be0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
21bf0 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
21c00 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
21c10 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
21c20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
21c30 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
21c40 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
21c50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21c60 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
21c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
21c80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
21c90 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
21ca0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
21cb0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
21cc0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
21cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
21ce0 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75  mem1.u.r<pRhs->u
21cf0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
21d00 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
21d10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
21d20 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e  em1.u.r>pRhs->u.
21d30 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
21d40 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
21d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
21d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
21d70 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  c = sqlite3IntFl
21d80 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e  oatCompare(mem1.
21d90 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b  u.i, pRhs->u.r);
21da0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21db0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21dc0 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
21dd0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
21de0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
21df0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
21e00 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
21e10 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
21e20 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
21e30 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
21e40 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
21e50 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21e60 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
21e70 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
21e80 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
21e90 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
21ea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
21eb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21ec0 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
21ed0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
21ee0 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
21ef0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
21f00 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
21f10 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
21f20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
21f30 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
21f40 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
21f50 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
21f60 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
21f70 64 29 6e 4b 65 79 31 0a 20 20 20 20 20 20 20 20  d)nKey1.        
21f80 20 7c 7c 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20   || (pKeyInfo = 
21f90 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
21fa0 29 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a  )->nAllField<=i.
21fb0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21fc0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
21fd0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
21fe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21ff0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
22000 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22010 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
22020 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
22030 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
22040 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
22050 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
22060 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
22070 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
22080 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
22090 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
220a0 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
220b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
220c0 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
220d0 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
220e0 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
220f0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
22100 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
22110 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
22120 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
22130 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
22140 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22160 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
22170 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
22180 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
22190 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
221a0 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
221b0 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
221c0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
221d0 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
221e0 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
221f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
22200 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
22210 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
22220 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
22230 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
22240 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73 2d    assert( (pRhs-
22250 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
22260 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e  o)==0 || pRhs->n
22270 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74  ==0 );.      get
22280 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
22290 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
222a0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
222b0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
222c0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
222d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
222e0 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
222f0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
22300 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
22310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22320 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
22330 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
22340 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
22350 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
22360 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
22370 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
22380 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
22390 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
223a0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
223b0 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
223c0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
223d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
223e0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
223f0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
22400 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
22410 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
22420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
22430 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
22440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68     }else if( pRh
22450 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  s->flags & MEM_Z
22460 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ero ){.         
22470 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
22480 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b  (const char*)&aK
22490 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b  ey1[d1],nStr) ){
224a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
224b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
224c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
224d0 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52    rc = nStr - pR
224e0 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  hs->u.nZero;.   
224f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22510 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
22520 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
22530 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22540 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
22550 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
22560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22570 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
22580 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
22590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
225a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
225b0 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
225c0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
225d0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
225e0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
225f0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
22600 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
22610 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
22620 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 70     if( pPKey2->p
22630 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
22640 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
22650 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
22660 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
22670 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
22680 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
22690 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
226a0 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  c) );.      asse
226b0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
226c0 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
226d0 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
226e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
226f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b  ;.    }..    i++
22700 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50 4b  ;.    if( i==pPK
22710 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72  ey2->nField ) br
22720 65 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  eak;.    pRhs++;
22730 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
22740 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
22750 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
22760 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
22770 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
22780 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
22790 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
227a0 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
227b0 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
227c0 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
227d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
227e0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
227f0 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
22800 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
22810 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
22820 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
22830 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
22840 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
22850 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
22860 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
22870 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
22880 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
22890 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
228a0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
228b0 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
228c0 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
228d0 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
228e0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
228f0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
22900 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
22910 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
22920 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
22930 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
22940 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
22950 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  */.  assert( COR
22960 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20  RUPT_DB .       
22970 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  || vdbeRecordCom
22980 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
22990 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
229a0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
229b0 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc) .       || p
229c0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
229d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
229e0 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d  d.  );.  pPKey2-
229f0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72  >eqSeen = 1;.  r
22a00 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
22a10 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20  fault_rc;.}.int 
22a20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22a30 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
22a40 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
22a50 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
22a60 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
22a70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
22a80 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2          /* 
22a90 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
22aa0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22ab0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22ac0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
22ad0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22ae0 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
22af0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
22b00 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
22b10 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
22b20 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
22b30 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
22b40 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
22b50 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
22b60 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
22b70 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
22b80 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
22b90 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
22ba0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
22bb0 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
22bc0 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
22bd0 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
22be0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
22bf0 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
22c00 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
22c10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
22c20 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
22c30 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
22c40 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
22c50 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
22c60 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
22c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
22c80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
22c90 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
22ca0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
22cb0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
22cc0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22cd0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
22ce0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
22cf0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
22d00 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
22d10 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
22d20 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
22d30 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
22d40 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
22d50 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
22d60 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
22d70 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
22d80 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68   i64 v;.  i64 lh
22d90 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
22da0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
22db0 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
22dc0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
22dd0 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
22de0 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
22df0 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
22e00 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
22e10 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
22e20 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
22e30 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
22e40 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
22e50 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
22e60 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
22e70 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
22e80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
22e90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
22ea0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
22eb0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
22ec0 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
22ed0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
22ee0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22ef0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
22f00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22f10 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
22f20 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
22f30 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
22f40 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
22f50 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
22f60 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
22f70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22f80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
22f90 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
22fa0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
22fb0 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
22fc0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
22fd0 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
22fe0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
22ff0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
23000 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23010 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
23020 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
23030 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
23040 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
23050 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
23060 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
23070 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
23080 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
23090 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
230a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
230b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
230c0 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
230d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
230e0 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
230f0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
23100 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
23110 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
23120 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
23130 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
23140 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
23150 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
23160 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23170 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
23180 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
23190 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
231a0 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
231b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
231c0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
231d0 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
231e0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
231f0 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
23200 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
23210 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
23220 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
23230 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
23240 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
23250 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
23260 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
23270 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
23280 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
23290 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
232a0 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
232b0 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
232c0 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
232d0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
232e0 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
232f0 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
23300 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
23310 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
23320 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
23330 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
23340 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
23350 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
23360 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
23370 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
23380 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23390 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
233a0 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
233b0 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
233c0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
233d0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
233e0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
233f0 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b  ;.  }..  v = pPK
23400 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
23410 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b  ;.  if( v>lhs ){
23420 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
23430 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r1;.  }else i
23440 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20  f( v<lhs ){.    
23450 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
23460 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
23470 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
23480 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
23490 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
234a0 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
234b0 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ual. Compare the
234c0 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a   trailing .    *
234d0 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20  * fields.  */.  
234e0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
234f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23500 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
23510 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
23520 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23530 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
23540 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
23550 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e  eys are equal an
23560 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  d there are no t
23570 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66  railing.    ** f
23580 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50  ields. Return pP
23590 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
235a0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a   in this case. *
235b0 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  /.    res = pPKe
235c0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
235d0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65      pPKey2->eqSe
235e0 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61  en = 1;.  }..  a
235f0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
23600 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
23610 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
23620 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65  y2, res) );.  re
23630 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
23640 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23650 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
23660 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
23670 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23680 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
23690 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
236a0 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
236b0 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
236c0 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
236d0 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
236e0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
236f0 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
23700 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
23710 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
23720 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
23730 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
23740 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
23750 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
23760 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
23770 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
23780 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
23790 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
237a0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
237b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
237c0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
237d0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
237e0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
237f0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38  Key1 = (const u8
23800 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73  *)pKey1;.  int s
23810 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e  erial_type;.  in
23820 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
23830 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
23840 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ].flags & MEM_St
23850 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72  r );.  vdbeAsser
23860 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
23870 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
23880 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
23890 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61  eyInfo);.  getVa
238a0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
238b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
238c0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
238d0 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20  e<12 ){.    res 
238e0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20  = pPKey2->r1;   
238f0 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
23900 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20  y1) is a number 
23910 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d  or a null */.  }
23920 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
23930 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
23940 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  { .    res = pPK
23950 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a  ey2->r2;      /*
23960 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
23970 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65  s a blob */.  }e
23980 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d  lse{.    int nCm
23990 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b  p;.    int nStr;
239a0 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d  .    int szHdr =
239b0 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20   aKey1[0];..    
239c0 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
239d0 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20  ype-12) / 2;.   
239e0 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53   if( (szHdr + nS
239f0 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20  tr) > nKey1 ){. 
23a00 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
23a10 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
23a20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
23a40 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
23a50 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   */.    }.    nC
23a60 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32  mp = MIN( pPKey2
23a70 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74  ->aMem[0].n, nSt
23a80 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d  r );.    res = m
23a90 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48  emcmp(&aKey1[szH
23aa0 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65  dr], pPKey2->aMe
23ab0 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a  m[0].z, nCmp);..
23ac0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
23ad0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53  {.      res = nS
23ae0 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  tr - pPKey2->aMe
23af0 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66  m[0].n;.      if
23b00 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
23b10 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
23b20 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
23b30 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
23b40 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23b50 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
23b60 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
23b70 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
23b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23b90 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
23ba0 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
23bb0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65      pPKey2->eqSe
23bc0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
23bd0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
23be0 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
23bf0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
23c00 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r2;.      }else
23c10 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
23c20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
23c30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
23c40 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
23c50 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
23c60 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
23c70 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23c80 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ->r1;.    }.  }.
23c90 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
23ca0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
23cb0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
23cc0 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20  pPKey2, res).   
23cd0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
23ce0 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65  B.       || pPKe
23cf0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
23d00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
23d10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
23d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23d30 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
23d40 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
23d50 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d  ordCompare() com
23d60 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e  patible function
23d70 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
23d80 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61   comparing seria
23d90 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f  lized records to
23da0 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   the unpacked re
23db0 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61  cord passed.** a
23dc0 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
23dd0 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f  ent..*/.RecordCo
23de0 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
23df0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
23e00 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
23e10 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f  .  /* varintReco
23e20 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
23e30 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  nd varintRecordC
23e40 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62  ompareString() b
23e50 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20  oth assume.  ** 
23e60 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
23e70 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74  -header varint t
23e80 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
23e90 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
23ea0 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73  record.  ** fits
23eb0 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
23ec0 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f  e (i.e. is 127 o
23ed0 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52  r less). varintR
23ee0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
23ef0 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75  ).  ** also assu
23f00 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  mes that it is s
23f10 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20  afe to overread 
23f20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c  a buffer by at l
23f30 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d  east the .  ** m
23f40 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20  aximum possible 
23f50 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a  legal header siz
23f60 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20  e plus 8 bytes. 
23f70 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73  Because there is
23f80 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64  .  ** guaranteed
23f90 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
23fa0 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29  74 (but not 136)
23fb0 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
23fc0 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  g following each
23fd0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73  .  ** buffer pas
23fe0 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63  sed to varintRec
23ff0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
24000 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f  this makes it co
24010 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a  nvenient to.  **
24020 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
24030 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  of the header to
24040 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73   64 bytes in cas
24050 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72  es where the fir
24060 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73  st field.  ** is
24070 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a   an integer..  *
24080 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65  *.  ** The easie
24090 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63  st way to enforc
240a0 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  e this limit is 
240b0 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79  to consider only
240c0 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20   records with.  
240d0 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20  ** 13 fields or 
240e0 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72  less. If the fir
240f0 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69  st field is an i
24100 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69  nteger, the maxi
24110 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68  mum legal.  ** h
24120 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31  eader size is (1
24130 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74  2*5 + 1 + 1) byt
24140 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  es.  */.  if( p-
24150 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  >pKeyInfo->nAllF
24160 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20  ield<=13 ){.    
24170 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61  int flags = p->a
24180 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20  Mem[0].flags;.  
24190 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66    if( p->pKeyInf
241a0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
241b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20   ){.      p->r1 
241c0 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32  = 1;.      p->r2
241d0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
241e0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
241f0 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20  -1;.      p->r2 
24200 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
24210 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f  f( (flags & MEM_
24220 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Int) ){.      re
24230 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
24240 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d  ompareInt;.    }
24250 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
24260 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
24270 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24280 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c   flags & MEM_Nul
24290 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
242a0 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  e( flags & MEM_B
242b0 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28  lob );.    if( (
242c0 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61  flags & (MEM_Rea
242d0 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45  l|MEM_IntReal|ME
242e0 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
242f0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 2d 3e  )==0.     && p->
24300 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
24310 30 5d 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  0]==0.    ){.   
24320 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
24330 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
24340 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
24350 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
24360 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ng;.    }.  }.. 
24370 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
24380 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  ;.}../*.** pCur 
243a0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
243b0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
243c0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
243d0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
243e0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
243f0 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
24400 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
24410 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
24420 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
24430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
24440 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
24450 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
24460 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
24470 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
24480 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
24490 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
244a0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
244b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
244c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
244d0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
244e0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
244f0 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
24500 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
24510 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
24520 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
24530 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
24540 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
24550 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
24560 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
24570 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
24580 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
24590 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
245a0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
245b0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
245c0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
245d0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
245e0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
245f0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
24600 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
24610 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
24620 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
24630 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
24640 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
24650 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
24660 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
24670 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
24680 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
24690 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
246a0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
246b0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
246c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
246d0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
246e0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
246f0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
24700 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
24710 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
24720 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24730 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
24740 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b  Cur) );.  nCellK
24750 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
24760 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
24770 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e  r);.  assert( (n
24780 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
24790 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
247a0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
247b0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
247c0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
247d0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
247e0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
247f0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
24800 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
24810 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
24820 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
24830 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29  32)nCellKey, &m)
24840 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
24850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24860 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
24870 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
24880 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
24890 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
248a0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
248b0 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
248c0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
248d0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
248e0 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
248f0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
24900 72 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a  r>0x7fffffff );.
24910 20 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30    assert( m.n>=0
24920 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
24930 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a  ly(szHdr<3 || sz
24940 48 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e  Hdr>(unsigned)m.
24950 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
24960 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
24970 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
24980 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
24990 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
249a0 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
249b0 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
249c0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
249d0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
249e0 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
249f0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
24a00 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
24a10 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
24a20 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
24a30 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
24a40 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
24a50 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
24a60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
24a70 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
24a80 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
24a90 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
24aa0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
24ab0 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
24ac0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
24ad0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
24ae0 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
24af0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
24b00 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
24b10 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
24b20 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
24b30 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
24b40 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
24b50 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
24b60 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
24b70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53  Rowid = sqlite3S
24b80 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79  mallTypeSizes[ty
24b90 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74  peRowid];.  test
24ba0 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
24bb0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
24bc0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
24bd0 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
24be0 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
24bf0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
24c00 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
24c10 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
24c20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
24c30 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
24c40 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
24c50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
24c60 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
24c70 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
24c80 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
24c90 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
24ca0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
24cb0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
24cc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
24cd0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
24ce0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
24cf0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
24d00 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
24d10 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
24d20 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
24d30 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
24d40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
24d50 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
24d60 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
24d70 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
24d80 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
24d90 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
24da0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
24db0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
24dd0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
24de0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
24df0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
24e00 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
24e10 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
24e20 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
24e30 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
24e40 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
24e50 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
24e60 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
24e70 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
24e80 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
24e90 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
24ea0 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
24eb0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
24ec0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
24ed0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
24ee0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
24ef0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
24f00 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
24f10 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
24f20 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
24f30 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
24f40 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
24f50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
24f60 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
24f70 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
24f80 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
24f90 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
24fa0 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
24fb0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
24fc0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
24fd0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
24fe0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
24ff0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
25000 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
25010 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25030 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
25040 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
25050 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
25060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25070 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
25080 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
25090 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
250a0 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
250b0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
250c0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
250d0 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
25100 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
25110 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
25120 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
25130 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
25140 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65  rsor *pCur;.  Me
25150 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
25160 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
25170 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
25180 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70   pCur = pC->uc.p
25190 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
251a0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
251b0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
251c0 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
251d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
251e0 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
251f0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
25200 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
25210 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
25220 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
25230 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
25240 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
25250 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
25260 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
25270 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
25280 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
25290 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
252a0 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
252b0 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
252c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
252d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
252e0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
252f0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
25300 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
25310 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
25320 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
25330 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
25340 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
25350 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25360 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
25370 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
25380 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a  ithSkip(m.n, m.z
25390 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b  , pUnpacked, 0);
253a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
253b0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
253c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
253d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
253e0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
253f0 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
25400 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
25410 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
25420 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
25430 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
25440 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
25450 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
25460 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
25470 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
25480 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
25490 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
254a0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
254b0 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
254c0 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
254d0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
254e0 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
254f0 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
25500 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
25510 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
25520 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
25530 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
25540 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
25550 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
25560 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
25570 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
25580 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
25590 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
255a0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
255b0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
255c0 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
255d0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
255e0 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
255f0 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
25600 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
25610 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
25620 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
25630 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
25640 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
25650 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
25660 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
25670 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
25680 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
25690 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
256a0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
256b0 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
256c0 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
256d0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
256e0 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
256f0 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
25700 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
25710 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
25720 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a  nts obsolete..**
25730 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20  .** If iCode is 
25740 31 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74 69  1, then expirati
25750 6f 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20  on is advisory. 
25760 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   The statement s
25770 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72  hould.** be repr
25780 65 70 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  epared before be
25790 69 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20 62  ing restarted, b
257a0 75 74 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ut if it is alre
257b0 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69  ady running.** i
257c0 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  t is allowed to 
257d0 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
257e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61  n..**.** Interna
257f0 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
25800 6f 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  on just sets the
25810 20 56 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c   Vdbe.expired fl
25820 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65  ag on all.** pre
25830 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
25840 2e 20 20 54 68 65 20 66 6c 61 67 20 69 73 20 73  .  The flag is s
25850 65 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69  et to 1 for an i
25860 6d 6d 65 64 69 61 74 65 20 65 78 70 69 72 61 74  mmediate expirat
25870 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74  ion.** and set t
25880 6f 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73  o 2 for an advis
25890 6f 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a  ory expiration..
258a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
258b0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
258c0 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
258d0 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b  *db, int iCode){
258e0 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
258f0 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
25900 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
25910 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
25920 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d  = iCode+1;.  }.}
25930 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25940 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
25950 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
25960 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
25970 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
25980 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
25990 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  rn v->db;.}../*.
259a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51  ** Return the SQ
259b0 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61  LITE_PREPARE fla
259c0 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a  gs for a Vdbe..*
259d0 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65  /.u8 sqlite3Vdbe
259e0 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64 62  PrepareFlags(Vdb
259f0 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
25a00 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a  v->prepFlags;.}.
25a10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25a20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
25a30 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
25a40 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
25a50 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
25a60 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
25a70 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
25a80 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
25a90 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
25aa0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
25ab0 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
25ac0 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
25ad0 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
25ae0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
25af0 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
25b00 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
25b10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
25b20 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
25b30 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
25b40 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
25b50 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
25b60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
25b70 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
25b80 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
25b90 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
25ba0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
25bb0 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
25bc0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
25bd0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
25be0 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
25bf0 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
25c00 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d   assert( (v->db-
25c10 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
25c20 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29  EnableQPSG)==0 )
25c30 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
25c40 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
25c50 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
25c60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
25c70 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
25c80 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
25c90 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
25ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25cb0 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
25cc0 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
25cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
25ce0 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
25cf0 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
25d00 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
25d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
25d20 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
25d30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
25d40 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
25d50 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
25d60 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
25d70 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
25d80 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
25d90 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
25da0 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
25db0 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
25dc0 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
25dd0 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
25de0 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
25df0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
25e00 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
25e10 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
25e20 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
25e30 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
25e40 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
25e50 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
25e60 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33  );.  if( iVar>=3
25e70 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  2 ){.    v->expm
25e80 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30  ask |= 0x8000000
25e90 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
25ea0 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
25eb0 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
25ec0 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
25ed0 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f   Cause a functio
25ee0 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  n to throw an er
25ef0 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63 61  ror if it was ca
25f00 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46  ll from OP_PureF
25f10 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  unc.** rather th
25f20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a  an OP_Function..
25f30 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e  **.** OP_PureFun
25f40 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  c means that the
25f50 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
25f60 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c  e deterministic,
25f70 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74   and should.** t
25f80 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
25f90 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70   it is given inp
25fa0 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  uts that would m
25fb0 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72  ake it non-deter
25fc0 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69  ministic..** Thi
25fd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
25fe0 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d  oked by date/tim
25ff0 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  e functions that
26000 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69   use non-determi
26010 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72  nistic.** featur
26020 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27  es such as 'now'
26030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26040 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69  NotPureFunc(sqli
26050 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
26060 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  x){.#ifdef SQLIT
26070 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
26080 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 43  R_STAT4.  if( pC
26090 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72  tx->pVdbe==0 ) r
260a0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
260b0 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62    if( pCtx->pVdb
260c0 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70  e->aOp[pCtx->iOp
260d0 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72  ].opcode==OP_Pur
260e0 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c  eFunc ){.    sql
260f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
26100 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
26110 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74  "non-determinist
26120 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69  ic function in i
26130 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20  ndex expression 
26140 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  or CHECK constra
26150 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29  int",.       -1)
26160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
26170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
26180 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
26190 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
261a0 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  BLE./*.** Transf
261b0 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  er error message
261c0 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71   text from an sq
261d0 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d  lite3_vtab.zErrM
261e0 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
261f0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
26200 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
26210 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20  e3_malloc) into 
26220 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28  a Vdbe.zErrMsg (
26230 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
26240 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
26250 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
26260 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64  Malloc)..*/.void
26270 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
26280 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70  rtErrmsg(Vdbe *p
26290 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
262a0 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56  pVtab){.  if( pV
262b0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
262c0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
262d0 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c  = p->db;.    sql
262e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
262f0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
26300 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
26310 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
26320 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
26330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
26340 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
26350 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a  g);.    pVtab->z
26360 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
26370 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
26380 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
26390 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
263a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
263b0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
263c0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
263d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
263e0 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
263f0 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
26400 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
26410 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
26420 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
26430 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
26440 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
26450 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
26460 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
26470 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
26480 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
26490 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
264a0 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
264b0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
264c0 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
264d0 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
264e0 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
264f0 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
26500 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
26510 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
26520 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
26530 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c  *db, int nField,
26540 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
26550 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
26560 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
26570 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64  or(i=0; i<nField
26580 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65  ; i++){.      Me
26590 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
265a0 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  em[i];.      if(
265b0 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
265c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
265d0 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
265e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
265f0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
26600 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
26610 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
26620 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
26630 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
26640 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
26650 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  HOOK./*.** Invok
26660 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  e the pre-update
26670 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69   hook. If this i
26680 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
26690 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 65  ELETE pre-update
266a0 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63   call,.** then c
266b0 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
266c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
266d0 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ent should point
266e0 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75   to the row abou
266f0 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74  t.** to be updat
26700 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  e or deleted. If
26710 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
26720 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70   calls sqlite3_p
26730 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a  reupdate_old(),.
26740 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ** the required 
26750 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
26760 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20  ad from the row 
26770 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
26780 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  s to..*/.void sq
26790 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61  lite3VdbePreUpda
267a0 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a  teHook(.  Vdbe *
267b0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
267c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
267d0 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
267e0 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  k is invoked by 
267f0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
26800 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
26810 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
26820 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c  o grab old.* val
26830 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ues from */.  in
26840 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26860 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
26870 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
26880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
26890 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
268a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
268b0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c  e name */.  Tabl
268c0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
268d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
268e0 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f  odified table */
268f0 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20  .  i64 iKey1,   
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65     /* Initial ke
26920 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  y value */.  int
26930 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20 20   iReg           
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26950 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77  Register for new
26960 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  .* record */.){.
26970 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26980 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65  v->db;.  i64 iKe
26990 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20  y2;.  PreUpdate 
269a0 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e  preupdate;.  con
269b0 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20  st char *zTbl = 
269c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  pTab->zName;.  s
269d0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66  tatic const u8 f
269e0 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30  akeSortOrder = 0
269f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  ;..  assert( db-
26a00 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29  >pPreUpdate==0 )
26a10 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75  ;.  memset(&preu
26a20 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pdate, 0, sizeof
26a30 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20  (PreUpdate));.  
26a40 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
26a50 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65  b)==0 ){.    iKe
26a60 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a  y1 = iKey2 = 0;.
26a70 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70 50      preupdate.pP
26a80 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
26a90 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
26aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
26ab0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50  f( op==SQLITE_UP
26ac0 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b  DATE ){.      iK
26ad0 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52  ey2 = v->aMem[iR
26ae0 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c  eg].u.i;.    }el
26af0 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20  se{.      iKey2 
26b00 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20  = iKey1;.    }. 
26b10 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43   }..  assert( pC
26b20 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62  sr->nField==pTab
26b30 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c  ->nCol .       |
26b40 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  | (pCsr->nField=
26b50 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26  =pTab->nCol+1 &&
26b60 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
26b70 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a  TE && iReg==-1).
26b80 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74    );..  preupdat
26b90 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70  e.v = v;.  preup
26ba0 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72  date.pCsr = pCsr
26bb0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70  ;.  preupdate.op
26bc0 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61   = op;.  preupda
26bd0 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65  te.iNewReg = iRe
26be0 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  g;.  preupdate.k
26bf0 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a  eyinfo.db = db;.
26c00 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
26c10 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62  nfo.enc = ENC(db
26c20 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  );.  preupdate.k
26c30 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64  eyinfo.nKeyField
26c40 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
26c50 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26c60 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  fo.aSortOrder = 
26c70 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72  (u8*)&fakeSortOr
26c80 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  der;.  preupdate
26c90 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a  .iKey1 = iKey1;.
26ca0 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
26cb0 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65  2 = iKey2;.  pre
26cc0 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54  update.pTab = pT
26cd0 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55  ab;..  db->pPreU
26ce0 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61  pdate = &preupda
26cf0 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70  te;.  db->xPreUp
26d00 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d  dateCallback(db-
26d10 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20  >pPreUpdateArg, 
26d20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62  db, op, zDb, zTb
26d30 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29  l, iKey1, iKey2)
26d40 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ;.  db->pPreUpda
26d50 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  te = 0;.  sqlite
26d60 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75  3DbFree(db, preu
26d70 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a  pdate.aRecord);.
26d80 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b    vdbeFreeUnpack
26d90 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ed(db, preupdate
26da0 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65  .keyinfo.nKeyFie
26db0 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e  ld+1, preupdate.
26dc0 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64  pUnpacked);.  vd
26dd0 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
26de0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  b, preupdate.key
26df0 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31  info.nKeyField+1
26e00 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77  , preupdate.pNew
26e10 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28  Unpacked);.  if(
26e20 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20   preupdate.aNew 
26e30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
26e40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73    for(i=0; i<pCs
26e50 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b  r->nField; i++){
26e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26e70 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72  beMemRelease(&pr
26e80 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29  eupdate.aNew[i])
26e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26ea0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
26eb0 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b  preupdate.aNew);
26ec0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
26ed0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
26ee0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
26ef0 0a                                               .