/ Hex Artifact Content
Login

Artifact 8152a4f732f55fadab542d4801349fc029e422e0639e2864b0a7a9eb29883861:


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 69 6e 74 20 6e 4e 65 77 20 3d 20 28 76 2d 3e   int nNew = (v->
1180: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
1190: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  v->nOpAlloc*2 : 
11a0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
11c0: 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (v->nOpAllo
11d0: 63 20 3f 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? v->nOpAlloc*
11e0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
11f0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
1200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1210: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
1220: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
1230: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
1240: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
1250: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
1260: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
1270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1280: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
1290: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
12a0: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
12b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
12d0: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
12e0: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
12f0: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
1300: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
1310: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
1320: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
1330: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
1340: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
1350: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1360: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
1370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1380: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
1390: 3b 0a 20 20 20 20 76 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    v->nOpAllo
13a0: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
13b0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
13c0: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
13d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
13e0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
13f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1400: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
1410: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
1420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
1430: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
1440: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1450: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1460: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1470: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1480: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1490: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
14a0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
14b0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
14d0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
14e0: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
14f0: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
1500: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
1510: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1520: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
1530: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
1540: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
1550: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1560: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1570: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1580: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1590: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
15a0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
15b0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
15c0: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
15d0: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
15e0: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
15f0: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
1600: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
1610: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
1620: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
1630: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
1640: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
1650: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1660: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1670: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1680: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1690: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
16a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
16b0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
16c0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
16d0: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
16e0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
16f0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1700: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
1710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
1720: 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  oc<=p->nOp );.  
1730: 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28  if( growOpArray(
1740: 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31  p, 1) ) return 1
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
1760: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1770: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1790: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
17a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
17b0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
17c0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
17d0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
17e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
17f0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
1800: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
1810: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1820: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1830: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
1840: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1850: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
1860: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=i ){.    retur
1870: 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c  n growOp3(p, op,
1880: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1890: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
18a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
18b0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
18c0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d  = (u8)op;.  pOp-
18d0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
18e0: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
18f0: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
1900: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
1910: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
1920: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
1930: 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c  USED;.#ifdef SQL
1940: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
1950: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f  IN_COMMENTS.  pO
1960: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
1970: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1980: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1990: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
19a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
19b0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
19c0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
19d0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
19e0: 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64  ]);.    test_add
19f0: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  op_breakpoint();
1a00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
1a10: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
1a20: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
1a30: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
1a40: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1a50: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1a60: 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72  ERAGE.  pOp->iSr
1a70: 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69  cLine = 0;.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1a90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1aa0: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1ab0: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad0: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1ae0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1af0: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1b00: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b10: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
1b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b30: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
1b40: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1b50: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
1b60: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1b70: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1b80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1b90: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1ba0: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  1, p2, 0);.}../*
1bb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1bc0: 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  or an unconditio
1bd0: 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  nal jump to inst
1be0: 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f  ruction iDest.*/
1bf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c00: 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e  Goto(Vdbe *p, in
1c10: 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75  t iDest){.  retu
1c20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1c30: 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp3(p, OP_Goto,
1c40: 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d   0, iDest, 0);.}
1c50: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c60: 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  de to cause the 
1c70: 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62  string zStr to b
1c80: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a  e loaded into.**
1c90: 20 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a   register iDest.
1ca0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1cb0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62  beLoadString(Vdb
1cc0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
1ce0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
1cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1d00: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
1d10: 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c   iDest, 0, zStr,
1d20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1d30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1d40: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c   initializes mul
1d50: 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20  tiple registers 
1d60: 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74  to string or int
1d70: 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  eger.** constant
1d80: 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
1d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65  s begin with iDe
1da0: 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20  st and increase 
1db0: 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a  consecutively..*
1dc0: 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69  * One register i
1dd0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f  s initialized fo
1de0: 72 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65  r each characgte
1df0: 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20  r in zTypes[].  
1e00: 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20  For each.** "s" 
1e10: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79  character in zTy
1e20: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1e30: 74 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20  ter is a string 
1e40: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1e50: 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20  is.** not NULL, 
1e60: 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68  or OP_Null if th
1e70: 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c  e value is a nul
1e80: 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20  l pointer.  For 
1e90: 65 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74  each "i" charact
1ea0: 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b  er.** in zTypes[
1eb0: 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ], the register 
1ec0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1ed0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
1ee0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
1ef0: 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
1f00: 20 65 6e 64 20 77 69 74 68 20 22 58 22 20 74 68   end with "X" th
1f10: 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  en an OP_ResultR
1f20: 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ow instruction.*
1f30: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  * is generated f
1f40: 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  or the values in
1f50: 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  serted..*/.void 
1f60: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1f70: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1f80: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1f90: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1fa0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1fc0: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1fd0: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1fe0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1ff0: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
2000: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
2010: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2020: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
2030: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
2040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2050: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
2060: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
2070: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
2080: 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st+i, 0, z, 0);.
2090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20a0: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='i' ){.      sq
20b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20c0: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
20d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
20e0: 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65  iDest+i);.    }e
20f0: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
2100: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f  skip_op_resultro
2110: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  w;.    }.  }.  s
2120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2130: 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (p, OP_ResultRow
2140: 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69  , iDest, i);.ski
2150: 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a  p_op_resultrow:.
2160: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
2170: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2180: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2190: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
21a0: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
21b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
21c0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
21d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
21e0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
21f0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2200: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
2210: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
2220: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
2230: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
2240: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
2250: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
2260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2270: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
2280: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
2290: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
22a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
22b0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
22c0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
22d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
22e0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
22f0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
2300: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
2310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2320: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
2330: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2340: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2350: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
2360: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
2370: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
2380: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2390: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
23a0: 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49  alue with a P4_I
23b0: 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45  NT64 or.** P4_RE
23c0: 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  AL type..*/.int 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23e0: 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70  4Dup8(.  Vdbe *p
23f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2400: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
2410: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
2420: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2430: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2440: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2460: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2470: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2490: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
24a0: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
24b0: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
24c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
24d0: 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f   u8 *zP4,      /
24e0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
2510: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
2520: 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70  ){.  char *p4cop
2530: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
2540: 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33  locRawNN(sqlite3
2550: 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20  VdbeDb(p), 8);. 
2560: 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65   if( p4copy ) me
2570: 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34  mcpy(p4copy, zP4
2580: 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 8);.  return s
2590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25a0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
25b0: 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79  p3, p4copy, p4ty
25c0: 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  pe);.}..#ifndef 
25d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
25e0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AIN./*.** Return
25f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2600: 74 68 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c  the current EXPL
2610: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62  AIN QUERY PLAN b
2620: 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65  aseline..** 0 me
2630: 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69  ans "none"..*/.i
2640: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  nt sqlite3VdbeEx
2650: 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73  plainParent(Pars
2660: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
2670: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
2680: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2690: 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  lain==0 ) return
26a0: 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69   0;.  pOp = sqli
26b0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 50 61  te3VdbeGetOp(pPa
26c0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
26d0: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29  se->addrExplain)
26e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
26f0: 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  p2;.}../*.** Set
2700: 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
2710: 6b 70 6f 69 6e 74 20 6f 6e 20 74 68 65 20 66 6f  kpoint on the fo
2720: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
2730: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d  in order to.** m
2740: 6f 6e 69 74 6f 72 20 74 68 65 20 45 58 50 4c 41  onitor the EXPLA
2750: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2760: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
2770: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2780: 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64  LITE_DEBUG).void
2790: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
27a0: 72 65 61 6b 70 6f 69 6e 74 28 63 6f 6e 73 74 20  reakpoint(const 
27b0: 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
27c0: 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 28 76 6f  char *z2){.  (vo
27d0: 69 64 29 7a 31 3b 0a 20 20 28 76 6f 69 64 29 7a  id)z1;.  (void)z
27e0: 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  2;.}.#endif../*.
27f0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f  ** Add a new OP_
2800: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
2810: 66 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67  f the bPush flag
2820: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d   is true, then m
2830: 61 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ake this opcode 
2840: 74 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a  the parent for.*
2850: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70  * subsequent Exp
2860: 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69  lains until sqli
2870: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f  te3VdbeExplainPo
2880: 70 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  p() is called..*
2890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
28a0: 62 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20  beExplain(Parse 
28b0: 2a 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73  *pParse, u8 bPus
28c0: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
28d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 23 69 66 6e 64  Fmt, ...){.#ifnd
28e0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 69 6e 63 6c    /* Always incl
2900: 75 64 65 20 74 68 65 20 4f 50 5f 45 78 70 6c 61  ude the OP_Expla
2910: 69 6e 20 6f 70 63 6f 64 65 73 20 69 66 20 53 51  in opcodes if SQ
2920: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
2930: 66 69 6e 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  fined..  ** But 
2940: 6f 6d 69 74 20 74 68 65 6d 20 28 66 6f 72 20 70  omit them (for p
2950: 65 72 66 6f 72 6d 61 6e 63 65 29 20 64 75 72 69  erformance) duri
2960: 6e 67 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75  ng production bu
2970: 69 6c 64 73 20 2a 2f 0a 20 20 69 66 28 20 70 50  ilds */.  if( pP
2980: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2990: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
29a0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
29b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76    Vdbe *v;.    v
29c0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69  a_list ap;.    i
29d0: 6e 74 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61  nt iThis;.    va
29e0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
29f0: 3b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ;.    zMsg = sql
2a00: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61  ite3VMPrintf(pPa
2a10: 72 73 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61  rse->db, zFmt, a
2a20: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2a30: 70 29 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72  p);.    v = pPar
2a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
2a50: 54 68 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  This = v->nOp;. 
2a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a70: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
2a80: 69 6e 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73  in, iThis, pPars
2a90: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  e->addrExplain, 
2aa0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ab0: 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50           zMsg, P
2ac0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
2ad0: 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72  sqlite3ExplainBr
2ae0: 65 61 6b 70 6f 69 6e 74 28 62 50 75 73 68 3f 22  eakpoint(bPush?"
2af0: 50 55 53 48 22 3a 22 22 2c 20 73 71 6c 69 74 65  PUSH":"", sqlite
2b00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
2b10: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
2b20: 20 62 50 75 73 68 29 7b 0a 20 20 20 20 20 20 70   bPush){.      p
2b30: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
2b40: 69 6e 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20  in = iThis;.    
2b50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2b60: 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  op the EXPLAIN Q
2b70: 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20  UERY PLAN stack 
2b80: 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  one level..*/.vo
2b90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  id sqlite3VdbeEx
2ba0: 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a  plainPop(Parse *
2bb0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
2bc0: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2bd0: 69 6e 74 28 22 50 4f 50 22 2c 20 30 29 3b 0a 20  int("POP", 0);. 
2be0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2bf0: 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  lain = sqlite3Vd
2c00: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2c10: 70 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69  pParse);.}.#endi
2c20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c30: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
2c40: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
2c50: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
2c60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2c70: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
2c80: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
2c90: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
2ca0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
2cb0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
2cc0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
2cd0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
2ce0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
2cf0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
2d00: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2d10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2d20: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
2d30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
2d40: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2d50: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
2d60: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
2d70: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
2d80: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
2d90: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
2da0: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
2db0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  j;.  sqlite3Vdbe
2dc0: 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72  AddOp4(p, OP_Par
2dd0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
2de0: 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  , 0, zWhere, P4_
2df0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
2e00: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
2e10: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
2e20: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
2e30: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
2e40: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
2e50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
2e60: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
2e70: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e80: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2e90: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2ea0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2eb0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2ec0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
2ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ee0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f10: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2f20: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2f30: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2f40: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2f50: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2f60: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f90: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
2fa0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
2fb0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
2fd0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
2fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
2ff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
3000: 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  ){.    VdbeOp *p
3010: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
3020: 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  r];.    pOp->p4t
3030: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
3040: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
3050: 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p4;.  }.  return
3060: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73   addr;.}../* Ins
3070: 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ert the end of a
3080: 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76   co-routine.*/.v
3090: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
30a0: 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65  ndCoroutine(Vdbe
30b0: 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c   *v, int regYiel
30c0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d){.  sqlite3Vdb
30d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
30e0: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  dCoroutine, regY
30f0: 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  ield);..  /* Cle
3100: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
3110: 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c   register cache,
3120: 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e   thereby ensurin
3130: 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a  g that each.  **
3140: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20   co-routine has 
3150: 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64  its own independ
3160: 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73  ent set of regis
3170: 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f  ters, because co
3180: 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d  -routines.  ** m
3190: 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69  ight expect thei
31a0: 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62  r registers to b
31b0: 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f  e preserved acro
31c0: 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20  ss an OP_Yield, 
31d0: 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f  and.  ** that co
31e0: 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65  uld cause proble
31f0: 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ms if two or mor
3200: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72  e co-routines ar
3210: 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  e using the same
3220: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
3230: 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20  register..  */. 
3240: 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d   v->pParse->nTem
3250: 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70  pReg = 0;.  v->p
3260: 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
3270: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
3280: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
3290: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
32a0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
32b0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
32c0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
32d0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
32e0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
32f0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
3300: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
3310: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
3320: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
3330: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
3340: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
3350: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
3360: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
3370: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
3380: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
3390: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
33a0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
33b0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
33c0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
33d0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
33e0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
33f0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
3400: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
3410: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
3420: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
3430: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
3440: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
3450: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
3460: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
3470: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
3480: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
3490: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
34a0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
34b0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
34c0: 65 64 2e 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20  ed..** (Later:) 
34d0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 74 72 75  This is only tru
34e0: 65 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 74 68  e for opcodes th
34f0: 61 74 20 68 61 76 65 20 74 68 65 20 4f 50 46 4c  at have the OPFL
3500: 47 5f 4a 55 4d 50 0a 2a 2a 20 70 72 6f 70 65 72  G_JUMP.** proper
3510: 74 79 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ty..**.** Variab
3520: 6c 65 20 75 73 61 67 65 20 6e 6f 74 65 73 3a 0a  le usage notes:.
3530: 2a 2a 0a 2a 2a 20 20 20 20 20 50 61 72 73 65 2e  **.**     Parse.
3540: 61 4c 61 62 65 6c 5b 78 5d 20 20 20 20 20 53 74  aLabel[x]     St
3550: 6f 72 65 73 20 74 68 65 20 61 64 64 72 65 73 73  ores the address
3560: 20 74 68 61 74 20 74 68 65 20 78 2d 74 68 20 6c   that the x-th l
3570: 61 62 65 6c 20 72 65 73 6f 6c 76 65 73 0a 2a 2a  abel resolves.**
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 2e 20 20           into.  
35a0: 46 6f 72 20 74 65 73 74 69 6e 67 20 28 53 51 4c  For testing (SQL
35b0: 49 54 45 5f 44 45 42 55 47 29 2c 20 75 6e 72 65  ITE_DEBUG), unre
35c0: 73 6f 6c 76 65 64 0a 2a 2a 20 20 20 20 20 20 20  solved.**       
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 6c 61 62 65 6c 73 20 73 74 6f 72 65 73 20    labels stores 
35f0: 2d 31 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  -1, but that is 
3600: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  not required..**
3610: 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65       Parse.nLabe
3620: 6c 41 6c 6c 6f 63 20 20 20 4e 75 6d 62 65 72 20  lAlloc   Number 
3630: 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  of slots allocat
3640: 65 64 20 74 6f 20 50 61 72 73 65 2e 61 4c 61 62  ed to Parse.aLab
3650: 65 6c 5b 5d 0a 2a 2a 20 20 20 20 20 50 61 72 73  el[].**     Pars
3660: 65 2e 6e 4c 61 62 65 6c 20 20 20 20 20 20 20 20  e.nLabel        
3670: 54 68 65 20 2a 6e 65 67 61 74 69 76 65 2a 20 6f  The *negative* o
3680: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
3690: 6c 61 62 65 6c 73 20 74 68 61 74 20 68 61 76 65  labels that have
36a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
36c0: 20 69 73 73 75 65 64 2e 20 20 54 68 65 20 6e 65   issued.  The ne
36d0: 67 61 74 69 76 65 20 69 73 20 73 74 6f 72 65 64  gative is stored
36e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 74 68 61 74 20 67 69 76 65 73 20 61      that gives a
3710: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
3720: 72 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20 73 74  rovement over st
3730: 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
3760: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 0a  positive value..
3770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3780: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 50 61 72 73  beMakeLabel(Pars
3790: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 72 65  e *pParse){.  re
37a0: 74 75 72 6e 20 2d 2d 70 50 61 72 73 65 2d 3e 6e  turn --pParse->n
37b0: 4c 61 62 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Label;.}../*.** 
37c0: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
37d0: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
37e0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
37f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
3800: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
3810: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
3820: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
3830: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3840: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
3850: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
3860: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 73 74 61  eLabel()..*/.sta
3870: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
3880: 49 4e 45 20 76 6f 69 64 20 72 65 73 69 7a 65 52  INE void resizeR
3890: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 50 61 72 73  esolveLabel(Pars
38a0: 65 20 2a 70 2c 20 56 64 62 65 20 2a 76 2c 20 69  e *p, Vdbe *v, i
38b0: 6e 74 20 6a 29 7b 0a 20 20 69 6e 74 20 6e 4e 65  nt j){.  int nNe
38c0: 77 53 69 7a 65 20 3d 20 31 30 20 2d 20 70 2d 3e  wSize = 10 - p->
38d0: 6e 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 61 4c 61  nLabel;.  p->aLa
38e0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52  bel = sqlite3DbR
38f0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e  eallocOrFree(p->
3900: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20  db, p->aLabel,. 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 6e 4e 65 77 53 69 7a 65 2a 73 69 7a      nNewSize*siz
3930: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
3940: 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61  ));.  if( p->aLa
3950: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  bel==0 ){.    p-
3960: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30  >nLabelAlloc = 0
3970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
3980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3990: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
39a0: 72 28 69 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  r(i=p->nLabelAll
39b0: 6f 63 3b 20 69 3c 6e 4e 65 77 53 69 7a 65 3b 20  oc; i<nNewSize; 
39c0: 69 2b 2b 29 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  i++) p->aLabel[i
39d0: 5d 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20  ] = -1;.#endif. 
39e0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
39f0: 63 20 3d 20 6e 4e 65 77 53 69 7a 65 3b 0a 20 20  c = nNewSize;.  
3a00: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
3a10: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 76   v->nOp;.  }.}.v
3a20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3a30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
3a40: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
3a50: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
3a60: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
3a70: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
3a80: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
3a90: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3aa0: 20 61 73 73 65 72 74 28 20 6a 3c 2d 70 2d 3e 6e   assert( j<-p->n
3ab0: 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Label );.  asser
3ac0: 74 28 20 6a 3e 3d 30 20 29 3b 0a 23 69 66 64 65  t( j>=0 );.#ifde
3ad0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3ae0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3af0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3b00: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3b10: 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56 45   printf("RESOLVE
3b20: 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64 5c   LABEL %d to %d\
3b30: 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a  n", x, v->nOp);.
3b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
3b50: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
3b60: 2b 20 70 2d 3e 6e 4c 61 62 65 6c 20 3c 20 30 20  + p->nLabel < 0 
3b70: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 52 65 73  ){.    resizeRes
3b80: 6f 6c 76 65 4c 61 62 65 6c 28 70 2c 76 2c 6a 29  olveLabel(p,v,j)
3b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3ba0: 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c  ssert( p->aLabel
3bb0: 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  [j]==(-1) ); /* 
3bc0: 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20  Labels may only 
3bd0: 62 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65  be resolved once
3be0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   */.    p->aLabe
3bf0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
3c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
3c10: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
3c20: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
3c30: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
3c40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c50: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
3c60: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
3c70: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
3c80: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
3c90: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
3ca0: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3cb0: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  n multiple times
3cc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3cd0: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64  3VdbeReusable(Vd
3ce0: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3cf0: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a  OnlyOnce = 0;.}.
3d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
3d10: 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41  EBUG /* sqlite3A
3d20: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3d30: 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  logic */../*.** 
3d40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  The following ty
3d50: 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20  pe and function 
3d60: 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72  are used to iter
3d70: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
3d80: 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20  opcodes.** in a 
3d90: 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61  Vdbe main progra
3da0: 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68  m and each of th
3db0: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28  e sub-programs (
3dc0: 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79  triggers) it may
3dd0: 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65   .** invoke dire
3de0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
3df0: 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  ly. It should be
3e00: 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73   used as follows
3e10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f  :.**.**   Op *pO
3e20: 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74  p;.**   VdbeOpIt
3e30: 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20  er sIter;.**.** 
3e40: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
3e50: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
3e60: 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76  ));.**   sIter.v
3e70: 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20   = v;           
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65   // v is of type
3ea0: 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69   Vdbe* .**   whi
3eb0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
3ec0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29  rNext(&sIter)) )
3ed0: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73  {.**     // Do s
3ee0: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f  omething with pO
3ef0: 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71  p.**   }.**   sq
3f00: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
3f10: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
3f20: 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20  .** .*/.typedef 
3f30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
3f40: 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74  r VdbeOpIter;.st
3f50: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
3f60: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f80: 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74  * Vdbe to iterat
3f90: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70  e through the op
3fa0: 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75  codes of */.  Su
3fb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
3fc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3fd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
3fe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20   */.  int nSub; 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4010: 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a  tries in apSub *
4020: 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20  /.  int iAddr;  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4040: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
4050: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4060: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
4070: 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   iSub;          
4080: 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d          /* 0 = m
4090: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d  ain program, 1 =
40a0: 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72   first sub-progr
40b0: 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74  am etc. */.};.st
40c0: 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e  atic Op *opIterN
40d0: 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a  ext(VdbeOpIter *
40e0: 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  p){.  Vdbe *v = 
40f0: 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74  p->v;.  Op *pRet
4100: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b   = 0;.  Op *aOp;
4110: 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69  .  int nOp;..  i
4120: 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e  f( p->iSub<=p->n
4130: 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20  Sub ){..    if( 
4140: 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20  p->iSub==0 ){.  
4150: 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70      aOp = v->aOp
4160: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d  ;.      nOp = v-
4170: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >nOp;.    }else{
4180: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e  .      aOp = p->
4190: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
41a0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
41b0: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
41c0: 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub-1]->nOp;.   
41d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
41e0: 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a  ->iAddr<nOp );..
41f0: 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b      pRet = &aOp[
4200: 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70  p->iAddr];.    p
4210: 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69  ->iAddr++;.    i
4220: 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70  f( p->iAddr==nOp
4230: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75   ){.      p->iSu
4240: 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41  b++;.      p->iA
4250: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ddr = 0;.    }. 
4260: 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e   .    if( pRet->
4270: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
4280: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69  OGRAM ){.      i
4290: 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e  nt nByte = (p->n
42a0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
42b0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
42c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
42d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75  or(j=0; j<p->nSu
42e0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
42f0: 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d   if( p->apSub[j]
4300: 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  ==pRet->p4.pProg
4310: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
4320: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4330: 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20  ==p->nSub ){.   
4340: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20       p->apSub = 
4350: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4360: 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d  OrFree(v->db, p-
4370: 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a  >apSub, nByte);.
4380: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e          if( !p->
4390: 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  apSub ){.       
43a0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
43b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
43c0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70        p->apSub[p
43d0: 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74  ->nSub++] = pRet
43e0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
43f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
4410: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
4420: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
4430: 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20   program stored 
4440: 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69  in the VM associ
4450: 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65  ated with pParse
4460: 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e   may.** throw an
4470: 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e   ABORT exception
4480: 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74   (causing the st
4490: 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  atement, but not
44a0: 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
44b0: 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c  ion.** to be rol
44c0: 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20  led back). This 
44d0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
44e0: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72  e if the main pr
44f0: 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20  ogram or any.** 
4500: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e  sub-programs con
4510: 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65  tains any of the
4520: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
4530: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
4540: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4550: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4560: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
4570: 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20    OP_HaltIfNull 
4580: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
4590: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
45a0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
45b0: 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a  *  OP_Destroy.**
45c0: 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65     *  OP_VUpdate
45d0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e  .**   *  OP_VRen
45e0: 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46  ame.**   *  OP_F
45f0: 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32  kCounter with P2
4600: 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ==0 (immediate f
4610: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
4620: 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f  raint).**   *  O
4630: 50 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54  P_CreateBtree/BT
4640: 52 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f  REE_INTKEY and O
4650: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
4660: 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52  .**      (for CR
4670: 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45  EATE TABLE AS SE
4680: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
4690: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
46a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
46b0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
46c0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
46d0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
46e0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
46f0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
4700: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
4710: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
4720: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
4730: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
4740: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4750: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
4760: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
4770: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
4780: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
4790: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
47a0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
47b0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
47c0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
47d0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
47e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
47f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
4800: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
4810: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
4820: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  bort = 0;.  int 
4830: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30  hasFkCounter = 0
4840: 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74  ;.  int hasCreat
4850: 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  eTable = 0;.  in
4860: 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  t hasInitCorouti
4870: 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  ne = 0;.  Op *pO
4880: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
4890: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
48a0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
48b0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
48c0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
48d0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
48e0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
48f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
4900: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
4910: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
4920: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
4930: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
4940: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
4950: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
4960: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 44  || opcode==OP_VD
4970: 65 73 74 72 6f 79 0a 20 20 20 20 20 7c 7c 20 28  estroy.     || (
4980: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
4990: 69 6f 6e 30 20 26 26 20 70 4f 70 2d 3e 70 34 2e  ion0 && pOp->p4.
49a0: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
49b0: 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e 54  &SQLITE_FUNC_INT
49c0: 45 52 4e 41 4c 29 0a 20 20 20 20 20 7c 7c 20 28  ERNAL).     || (
49d0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
49e0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
49f0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
4a00: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 29 21    && ((pOp->p1)!
4a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4f  =SQLITE_OK && pO
4a20: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
4a30: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
4a40: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
4a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4a60: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
4a70: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 26  OP_CreateBtree &
4a80: 26 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45  & pOp->p3==BTREE
4a90: 5f 49 4e 54 4b 45 59 20 29 20 68 61 73 43 72 65  _INTKEY ) hasCre
4aa0: 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ateTable = 1;.  
4ab0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
4ac0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29  _InitCoroutine )
4ad0: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4ae0: 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  e = 1;.#ifndef S
4af0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
4b00: 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f  GN_KEY.    if( o
4b10: 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e  pcode==OP_FkCoun
4b20: 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d  ter && pOp->p1==
4b30: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20  0 && pOp->p2==1 
4b40: 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f  ){.      hasFkCo
4b50: 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d  unter = 1;.    }
4b60: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
4b70: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
4b80: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
4b90: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
4ba0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
4bb0: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
4bc0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
4bd0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
4be0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
4bf0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
4c00: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
4c10: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
4c20: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
4c30: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
4c40: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
4c50: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
4c60: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
4c70: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
4c80: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
4c90: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
4ca0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
4cb0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
4cc0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
4cd0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
4ce0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
4cf0: 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73  =mayAbort || has
4d00: 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  FkCounter.      
4d10: 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43          || (hasC
4d20: 72 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61  reateTable && ha
4d30: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20  sInitCoroutine) 
4d40: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
4d50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
4d60: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
4d70: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
4d80: 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  on */..#ifdef SQ
4d90: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
4da0: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
4db0: 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20 69 6e  Write counter in
4dc0: 20 74 68 65 20 56 44 42 45 20 69 66 20 74 68 65   the VDBE if the
4dd0: 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 61   cursor is not a
4de0: 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 63  n.** ephemeral c
4df0: 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74 68 65  ursor, or if the
4e00: 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65 6e 74   cursor argument
4e10: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69   is NULL..*/.voi
4e20: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63  d sqlite3VdbeInc
4e30: 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 56 64  rWriteCounter(Vd
4e40: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
4e50: 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20 70 43  r *pC){.  if( pC
4e60: 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65  ==0.   || (pC->e
4e70: 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45  CurType!=CURTYPE
4e80: 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20 20 26  _SORTER.       &
4e90: 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d  & pC->eCurType!=
4ea0: 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f 0a 20  CURTYPE_PSEUDO. 
4eb0: 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e 69 73        && !pC->is
4ec0: 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a  Ephemeral).  ){.
4ed0: 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b      p->nWrite++;
4ee0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
4ef0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4f00: 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20  UG./*.** Assert 
4f10: 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74 20 74  if an Abort at t
4f20: 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  his point in tim
4f30: 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  e might result i
4f40: 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64  n a corrupt.** d
4f50: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
4f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
4f70: 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65  rtAbortable(Vdbe
4f80: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4f90: 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  p->nWrite==0 || 
4fa0: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
4fb0: 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  al );.}.#endif..
4fc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4fd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
4fe0: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
4ff0: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
5000: 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20  d.  It loops.** 
5010: 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
5020: 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65  opcodes and fixe
5030: 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c  s up some detail
5040: 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72  s..**.** (1) For
5050: 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72   each jump instr
5060: 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65  uction with a ne
5070: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
5080: 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20  (a label).**    
5090: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20   resolve the P2 
50a0: 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75  value to an actu
50b0: 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  al address..**.*
50c0: 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68  * (2) Compute th
50d0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
50e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73   of arguments us
50f0: 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75  ed by any SQL fu
5100: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e  nction.**     an
5110: 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c  d store that val
5120: 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41  ue in *pMaxFuncA
5130: 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55  rgs..**.** (3) U
5140: 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72  pdate the Vdbe.r
5150: 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65  eadOnly and Vdbe
5160: 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73  .bIsReader flags
5170: 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a   to accurately.*
5180: 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77  *     indicate w
5190: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
51a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61   statement actua
51b0: 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  lly does..**.** 
51c0: 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  (4) Initialize t
51d0: 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70  he p4.xAdvance p
51e0: 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65  ointer on opcode
51f0: 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a  s that use it..*
5200: 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d  *.** (5) Reclaim
5210: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
5220: 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e  cated for storin
5230: 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20  g labels..**.** 
5240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
5250: 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20  l only function 
5260: 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68 65  correctly if the
5270: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67   mkopcodeh.tcl g
5280: 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69  enerator.** scri
5290: 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20 6f  pt numbers the o
52a0: 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c 79  pcodes correctly
52b0: 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74 68  .  Changes to th
52c0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
52d0: 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65  be.** coordinate
52e0: 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20 74  d with changes t
52f0: 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e  o mkopcodeh.tcl.
5300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5310: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
5320: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d  Vdbe *p, int *pM
5330: 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69  axFuncArgs){.  i
5340: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
5350: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
5360: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
5370: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
5380: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
5390: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
53a0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
53b0: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
53c0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f  Reader = 0;.  pO
53d0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  p = &p->aOp[p->n
53e0: 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31  Op-1];.  while(1
53f0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  ){..    /* Only 
5400: 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e 64  JUMP opcodes and
5410: 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74 20   the short list 
5420: 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f 64  of special opcod
5430: 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63 68  es in the switch
5440: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65  .    ** below ne
5450: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
5460: 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f  red.  The mkopco
5470: 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f  deh.tcl generato
5480: 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73 0a  r script groups.
5490: 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65      ** all these
54a0: 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68 65   opcodes togethe
54b0: 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e 74  r near the front
54c0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 6c   of the opcode l
54d0: 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a  ist.  Skip.    *
54e0: 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68 61  * any opcode tha
54f0: 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
5500: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76 69  processing by vi
5510: 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61 63  rtual of the fac
5520: 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 74  t that.    ** it
5530: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
5540: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f  SQLITE_MX_JUMP_O
5550: 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72 66  PCODE, as a perf
5560: 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
5570: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
5580: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
5590: 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  <=SQLITE_MX_JUMP
55a0: 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20 20  _OPCODE ){.     
55b0: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
55c0: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
55d0: 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61  codeh.tcl when a
55e0: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
55f0: 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 73  g.      ** cases
5600: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
5610: 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74  h! */.      swit
5620: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
5630: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
5640: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
5650: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
5660: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
5670: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
5680: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
5690: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20  thru */.        
56a0: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  }.        case O
56b0: 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20  P_AutoCommit:.  
56c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
56d0: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
56e0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
56f0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
5700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5710: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
5720: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
5730: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
5740: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
5750: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
5760: 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61 73  uum:.        cas
5770: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
5780: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  : {.          p-
5790: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
57a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
57b0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
57c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
57d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
57e0: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
57f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
5800: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
5810: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
5820: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
5830: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
5840: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5850: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
5860: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
5870: 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76  de generator nev
5880: 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20  er codes any of 
5890: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73  these opcodes as
58a0: 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20   a jump.        
58b0: 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e    ** to a label.
58c0: 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79    They are alway
58d0: 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d  s coded as a jum
58e0: 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61  p backwards to a
58f0: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b   .          ** k
5900: 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  nown address */.
5910: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5920: 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
5930: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5950: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
5960: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70   {.          pOp
5970: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
5980: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
5990: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 20 20  ious;.          
59a0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
59b0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
59c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
59d0: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
59e0: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
59f0: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5a00: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5a10: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5a20: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5a30: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
5a40: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
5a50: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
5a60: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
5a70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5a80: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
5a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5aa0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
5ab0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5ac0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
5ad0: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
5ae0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5af0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
5b00: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
5b10: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
5b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5b30: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5b40: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
5b50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a           int n;.
5b60: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5b70: 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  ( (pOp - p->aOp)
5b80: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
5b90: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
5ba0: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
5bb0: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
5bc0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
5bd0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
5be0: 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d   n>nMaxArgs ) nM
5bf0: 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20  axArgs = n;.    
5c00: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
5c10: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 64  rough into the d
5c20: 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20  efault case */. 
5c30: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
5c40: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
5c50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
5c60: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
5c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5c80: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73   mkopcodeh.tcl s
5c90: 63 72 69 70 74 20 68 61 73 20 73 6f 20 61 72 72  cript has so arr
5ca0: 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74 68 61  anged things tha
5cb0: 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20  t the only.     
5cc0: 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75         ** non-ju
5cd0: 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20  mp opcodes less 
5ce0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
5cf0: 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61  UMP_CODE are gua
5d00: 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20  ranteed to.     
5d10: 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e         ** have n
5d20: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
5d30: 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20  es for P2. */.  
5d40: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5d50: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
5d60: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
5d70: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
5d80: 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  MP)!=0 );.      
5d90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44        assert( AD
5da0: 44 52 28 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61  DR(pOp->p2)<-pPa
5db0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  rse->nLabel );. 
5dc0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
5dd0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52  p2 = aLabel[ADDR
5de0: 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20  (pOp->p2)];.    
5df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5e10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5e20: 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65   /* The mkopcode
5e30: 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68 61 73  h.tcl script has
5e40: 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69   so arranged thi
5e50: 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c  ngs that the onl
5e60: 79 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a  y.      ** non-j
5e70: 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73 73  ump opcodes less
5e80: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f   than SQLITE_MX_
5e90: 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67 75  JUMP_CODE are gu
5ea0: 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
5eb0: 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65    ** have non-ne
5ec0: 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f  gative values fo
5ed0: 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61  r P2. */.      a
5ee0: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f  ssert( (sqlite3O
5ef0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
5f00: 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47  p->opcode]&OPFLG
5f10: 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70  _JUMP)==0 || pOp
5f20: 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a  ->p2>=0);.    }.
5f30: 20 20 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e      if( pOp==p->
5f40: 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  aOp ) break;.   
5f50: 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71   pOp--;.  }.  sq
5f60: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5f70: 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  b, pParse->aLabe
5f80: 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c  l);.  pParse->aL
5f90: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72  abel = 0;.  pPar
5fa0: 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->nLabel = 0;.
5fb0: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
5fc0: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73  = nMaxArgs;.  as
5fd0: 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
5fe0: 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41  er!=0 || DbMaskA
5ff0: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
6000: 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ask) );.}../*.**
6010: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
6020: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
6030: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
6040: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69  e inserted..*/.i
6050: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
6060: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a  rrentAddr(Vdbe *
6070: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
6080: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
6090: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74  IC_INIT );.  ret
60a0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f  urn p->nOp;.}../
60b0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
60c0: 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f   at least N opco
60d0: 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61  de slots are ava
60e0: 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68  ilable in p with
60f0: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
6100: 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65   malloc for more
6110: 20 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77   space (except w
6120: 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69  hen compiled usi
6130: 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  ng.** SQLITE_TES
6140: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
6150: 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61  ).  This interfa
6160: 63 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  ce is used durin
6170: 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20  g testing.** to 
6180: 76 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  verify that cert
6190: 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ain calls to sql
61a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
61b0: 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a  t() can never.**
61c0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f   fail due to a O
61d0: 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e  OM fault and hen
61e0: 63 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ce that the retu
61f0: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  rn value from.**
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6210: 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77  pList() will alw
6220: 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e  ays be non-NULL.
6230: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
6240: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
6250: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6260: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
6270: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74  RESS).void sqlit
6280: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61  e3VdbeVerifyNoMa
6290: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62  llocRequired(Vdb
62a0: 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  e *p, int N){.  
62b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b  assert( p->nOp +
62c0: 20 4e 20 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f   N <= p->nOpAllo
62d0: 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  c );.}.#endif../
62e0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
62f0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
6300: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
6310: 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ent does not con
6320: 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65  tain.** an OP_Re
6330: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20  sultRow opcode. 
6340: 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28 29  Fail an assert()
6350: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68 69   if it does. Thi
6360: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79 20  s is used.** by 
6370: 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e 63  code in pragma.c
6380: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
6390: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
63a0: 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a  on of certain.**
63b0: 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74   pragmas comport
63c0: 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67 73  s with the flags
63d0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
63e0: 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74 63  e mkpragmatab.tc
63f0: 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a  l.** script..*/.
6400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6410: 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65  TE_DEBUG) && !de
6420: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
6430: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
6440: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  ).void sqlite3Vd
6450: 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c 74  beVerifyNoResult
6460: 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Row(Vdbe *p){.  
6470: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6480: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
6490: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
64a0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
64b0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a  OP_ResultRow );.
64c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
64d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
64e0: 65 20 28 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41  e (a single OP_A
64f0: 62 6f 72 74 61 62 6c 65 20 6f 70 63 6f 64 65 29  bortable opcode)
6500: 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65   that will.** ve
6510: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 56 44  rify that the VD
6520: 42 45 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 73  BE program can s
6530: 61 66 65 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74  afely call Abort
6540: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a   in the current.
6550: 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23  ** context..*/.#
6560: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6570: 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71  E_DEBUG).void sq
6580: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 41  lite3VdbeVerifyA
6590: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
65a0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
65b0: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
65c0: 45 5f 41 62 6f 72 74 20 29 20 73 71 6c 69 74 65  E_Abort ) sqlite
65d0: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
65e0: 50 5f 41 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a  P_Abortable);.}.
65f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
6600: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
6610: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
6620: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70   the array of op
6630: 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64  codes associated
6640: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62   with.** the Vdb
6650: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
6660: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
6670: 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
6680: 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
6690: 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66  .** to arrange f
66a0: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  or the returned 
66b0: 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e  array to be even
66c0: 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
66d0: 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46  ng the .** vdbeF
66e0: 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e  reeOpArray() fun
66f0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  ction..**.** Bef
6700: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6710: 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74  pnOp is set to t
6720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
6730: 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75  ries in the retu
6740: 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41  rned.** array. A
6750: 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69  lso, *pnMaxArg i
6760: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72  s set to the lar
6770: 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65  ger of its curre
6780: 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a  nt value and .**
6790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
67a0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64  ntries in the Vd
67b0: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
67c0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65   required to exe
67d0: 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74  cute the .** ret
67e0: 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a  urned program..*
67f0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6800: 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79  3VdbeTakeOpArray
6810: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
6820: 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41  nOp, int *pnMaxA
6830: 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61  rg){.  VdbeOp *a
6840: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61  Op = p->aOp;.  a
6850: 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70  ssert( aOp && !p
6860: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6870: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ed );..  /* Chec
6880: 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64  k that sqlite3Vd
6890: 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61  beUsesBtree() wa
68a0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20  s not called on 
68b0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73  this VM */.  ass
68c0: 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  ert( DbMaskAllZe
68d0: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
68e0: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
68f0: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
6900: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
6910: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
6920: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
6930: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
6940: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
6950: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
6960: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
6970: 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20  k.  Return a.** 
6980: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
6990: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  irst operation i
69a0: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  nserted..**.** N
69b0: 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d  on-zero P2 argum
69c0: 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73  ents to jump ins
69d0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75  tructions are au
69e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75  tomatically adju
69f0: 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20  sted.** so that 
6a00: 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20  the jump target 
6a10: 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  is relative to t
6a20: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
6a30: 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  on inserted..*/.
6a40: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
6a50: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20  dbeAddOpList(.  
6a60: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6a80: 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74  Add opcodes to t
6a90: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
6aa0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ement */.  int n
6ab0: 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
6ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6ad0: 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20  r of opcodes to 
6ae0: 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c  add */.  VdbeOpL
6af0: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20  ist const *aOp, 
6b00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
6b10: 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64 65 64  odes to be added
6b20: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e   */.  int iLinen
6b30: 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
6b40: 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c     /* Source-fil
6b50: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  e line number of
6b60: 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f   first opcode */
6b70: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  .){.  int i;.  V
6b80: 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46  dbeOp *pOut, *pF
6b90: 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  irst;.  assert( 
6ba0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
6bb0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6bc0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6bd0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
6be0: 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  Op > p->nOpAlloc
6bf0: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
6c00: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
6c10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
6c20: 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26  First = pOut = &
6c30: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a  p->aOp[p->nOp];.
6c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
6c50: 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f  ; i++, aOp++, pO
6c60: 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ut++){.    pOut-
6c70: 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f  >opcode = aOp->o
6c80: 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d  pcode;.    pOut-
6c90: 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20  >p1 = aOp->p1;. 
6ca0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f     pOut->p2 = aO
6cb0: 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72  p->p2;.    asser
6cc0: 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( aOp->p2>=0 );
6cd0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
6ce0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
6cf0: 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  aOp->opcode] & O
6d00: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
6d10: 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20   aOp->p2>0 ){.  
6d20: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20      pOut->p2 += 
6d30: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  p->nOp;.    }.  
6d40: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70    pOut->p3 = aOp
6d50: 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p3;.    pOut->
6d60: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6d70: 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  SED;.    pOut->p
6d80: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75  4.p = 0;.    pOu
6d90: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
6da0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6db0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
6dc0: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d  .    pOut->zComm
6dd0: 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ent = 0;.#endif.
6de0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
6df0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
6e00: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
6e10: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
6e20: 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e  e.    (void)iLin
6e30: 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  eno;.#endif.#ifd
6e40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6e50: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
6e60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
6e70: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
6e80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6e90: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d  ePrintOp(0, i+p-
6ea0: 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  >nOp, &p->aOp[i+
6eb0: 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a  p->nOp]);.    }.
6ec0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e  #endif.  }.  p->
6ed0: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65  nOp += nOp;.  re
6ee0: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
6ef0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6f00: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
6f10: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
6f20: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
6f30: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
6f40: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
6f50: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
6f60: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
6f70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6f80: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
6f90: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6fb0: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
6fc0: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
6fd0: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
7000: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
7010: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
7020: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
7030: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
7040: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
7050: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
7060: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
7070: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
7080: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
7090: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
70a0: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
70d0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
70e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
70f0: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
7100: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7110: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
7120: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
7130: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
7140: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
7150: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
7160: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
7170: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
7180: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
7190: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
71a0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
71b0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
71c0: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
71d0: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
71e0: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
71f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
7200: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
7210: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
7220: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
7230: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
7240: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
7250: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
7260: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
7270: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
7280: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
7290: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
72a0: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
72b0: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
72c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
72d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
72e0: 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50  opcode, or P1, P
72f0: 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65  2, P3, or P5 ope
7300: 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73  rands.** for a s
7310: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
7320: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
7330: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
7340: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33  code(Vdbe *p, u3
7350: 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f  2 addr, u8 iNewO
7360: 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65  pcode){.  sqlite
7370: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
7380: 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65  r)->opcode = iNe
7390: 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20  wOpcode;.}.void 
73a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
73b0: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP1(Vdbe *p, u32
73c0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
73d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
73e0: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20  tOp(p,addr)->p1 
73f0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
7400: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7410: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
7420: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
7430: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
7440: 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20  p(p,addr)->p2 = 
7450: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
7460: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
7470: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
7480: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
7490: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
74a0: 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61  p,addr)->p3 = va
74b0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
74c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
74d0: 62 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a  be *p, u16 p5){.
74e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
74f0: 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  >0 || p->db->mal
7500: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
7510: 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d  f( p->nOp>0 ) p-
7520: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
7530: 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  5 = p5;.}../*.**
7540: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
7550: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
7560: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
7570: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
7580: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
7590: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
75a0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
75b0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
75c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
75d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
75e0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
75f0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
7600: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
7610: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
7620: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
7630: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
7640: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
7650: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
7660: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
7670: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
7680: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
7690: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
76a0: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
76b0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
76c0: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70  *pDef){.  if( (p
76d0: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
76e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48   SQLITE_FUNC_EPH
76f0: 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  EM)!=0 ){.    sq
7700: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
7710: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
7720: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
7730: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
7740: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
7750: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
7760: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
7770: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
7780: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
7790: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d  INE void freeP4M
77a0: 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  em(sqlite3 *db, 
77b0: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  Mem *p){.  if( p
77c0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
77d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
77e0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71  ->zMalloc);.  sq
77f0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
7800: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53  , p);.}.static S
7810: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
7820: 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74  oid freeP4FuncCt
7830: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  x(sqlite3 *db, s
7840: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7850: 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65  p){.  freeEpheme
7860: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
7870: 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69  p->pFunc);. sqli
7880: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
7890: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  p);.}.static voi
78a0: 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33  d freeP4(sqlite3
78b0: 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65   *db, int p4type
78c0: 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61  , void *p4){.  a
78d0: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73  ssert( db );.  s
78e0: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
78f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
7900: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72  CCTX: {.      fr
7910: 65 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20  eeP4FuncCtx(db, 
7920: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7930: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7940: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7950: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
7960: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20  case P4_INT64:. 
7970: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
7980: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
7990: 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73  DYNBLOB:.    cas
79a0: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
79b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
79c0: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
79d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
79e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
79f0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66  INFO: {.      if
7a00: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
7a10: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b  ed==0 ) sqlite3K
7a20: 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79  eyInfoUnref((Key
7a30: 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20  Info*)p4);.     
7a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7a50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7a60: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7a70: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
7a80: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7a90: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7aa0: 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20  (Expr*)p4);.    
7ab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7ac0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
7ad0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
7ae0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
7af0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75  Function(db, (Fu
7b00: 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20  ncDef*)p4);.    
7b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7b20: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
7b30: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
7b40: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
7b50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7b60: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
7b70: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b  ite3_value*)p4);
7b80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7b90: 20 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d 28        freeP4Mem(
7ba0: 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20  db, (Mem*)p4);. 
7bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7bd0: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
7be0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7bf0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
7c00: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
7c10: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
7c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7c40: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
7c50: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
7c60: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
7c70: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
7c80: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
7c90: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
7ca0: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
7cb0: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
7cc0: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
7cd0: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
7ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
7cf0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
7d00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
7d10: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
7d20: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
7d30: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
7d40: 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d  (pOp=&aOp[nOp-1]
7d50: 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d  ; pOp>=aOp; pOp-
7d60: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  -){.      if( pO
7d70: 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20 50 34 5f  p->p4type <= P4_
7d80: 46 52 45 45 5f 49 46 5f 4c 45 20 29 20 66 72 65  FREE_IF_LE ) fre
7d90: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
7da0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
7db0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7dc0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
7dd0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
7de0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7df0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
7e00: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
7e10: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7e20: 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29 3b 0a 20  eeNN(db, aOp);. 
7e30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b   }.}../*.** Link
7e40: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
7e50: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
7e60: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7e70: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
7e80: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
7e90: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
7ea0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
7eb0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
7ec0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
7ed0: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
7ee0: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
7ef0: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
7f00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
7f10: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
7f20: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
7f30: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
7f40: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
7f50: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
7f60: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
7f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
7f80: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
7f90: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
7fa0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
7fb0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
7fc0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
7fd0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
7fe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7ff0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8000: 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74  turn 0;.  assert
8010: 28 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ( addr>=0 && add
8020: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f  r<p->nOp );.  pO
8030: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
8040: 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64  ];.  freeP4(p->d
8050: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
8060: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
8070: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
8080: 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70  OTUSED;.  pOp->p
8090: 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.z = 0;.  pOp->
80a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
80b0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
80c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
80d0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70  st opcode is "op
80e0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  " and it is not 
80f0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
8100: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  on,.** then remo
8110: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74  ve it.  Return t
8120: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  rue if and only 
8130: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73  if an opcode was
8140: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
8150: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
8160: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
8170: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
8180: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26   if( p->nOp>0 &&
8190: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
81a0: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
81b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
81c0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
81d0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
81e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
81f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
8200: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8210: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
8220: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
8230: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
8240: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
8250: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
8260: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
8270: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
8280: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
8290: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
82a0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
82b0: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
82c0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
82d0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
82e0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
82f0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
8300: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
8310: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
8320: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
8330: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
8340: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
8350: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
8360: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
8370: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
8380: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
8390: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
83a0: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
83b0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
83c0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
83d0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
83e0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a  tes of zP4..** .
83f0: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
8400: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
8410: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
8420: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
8430: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
8440: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
8450: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
8460: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
8470: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
8480: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
8490: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
84a0: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
84b0: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
84c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
84d0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
84e0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
84f0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
8500: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  struction..*/.st
8510: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
8520: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68  _NOINLINE vdbeCh
8530: 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64  angeP4Full(.  Vd
8540: 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70  be *p,.  Op *pOp
8550: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8560: 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a  zP4,.  int n.){.
8570: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
8580: 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28  e ){.    freeP4(
8590: 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  p->db, pOp->p4ty
85a0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
85b0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
85c0: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
85d0: 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  .p = 0;.  }.  if
85e0: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( n<0 ){.    sql
85f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8600: 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  (p, (int)(pOp - 
8610: 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29  p->aOp), zP4, n)
8620: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
8630: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
8640: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
8650: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
8660: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
8670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
8680: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
8690: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
86a0: 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  C;.  }.}.void sq
86b0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
86c0: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
86d0: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
86e0: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
86f0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
8700: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
8710: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
8720: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
8730: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
8740: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
8750: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21   assert( p->aOp!
8760: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
8770: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8790: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50   ){.    if( n!=P
87a0: 34 5f 56 54 41 42 20 29 20 66 72 65 65 50 34 28  4_VTAB ) freeP4(
87b0: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
87c0: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
87d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
87e0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
87f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
8800: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
8810: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
8820: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
8830: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
8840: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
8850: 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70   if( n>=0 || pOp
8860: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8870: 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c  vdbeChangeP4Full
8880: 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29  (p, pOp, zP4, n)
8890: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
88a0: 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  }.  if( n==P4_IN
88b0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
88c0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
88d0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
88e0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
88f0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
8900: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
8910: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
8920: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
8930: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
8940: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
8950: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
8960: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
8970: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
8980: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
8990: 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f  t( n<0 );.    pO
89a0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
89b0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
89c0: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
89d0: 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20  char)n;.    if( 
89e0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c  n==P4_VTAB ) sql
89f0: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
8a00: 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a  able*)zP4);.  }.
8a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
8a20: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f  the P4 operand o
8a30: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8a40: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
8a50: 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65  ction .** to the
8a60: 20 76 61 6c 75 65 20 64 65 66 69 6e 65 64 20 62   value defined b
8a70: 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e  y the arguments.
8a80: 20 20 54 68 69 73 20 69 73 20 61 20 68 69 67 68    This is a high
8a90: 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f  -speed.** versio
8aa0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
8ab0: 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a  ChangeP4()..**.*
8ac0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
8ad0: 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62   must not have b
8ae0: 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64  een previously d
8af0: 65 66 69 6e 65 64 2e 20 20 41 6e 64 20 74 68 65  efined.  And the
8b00: 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20   new.** P4 must 
8b10: 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54 33 32 2e  not be P4_INT32.
8b20: 20 20 55 73 65 20 73 71 6c 69 74 65 33 56 64 62    Use sqlite3Vdb
8b30: 65 43 68 61 6e 67 65 50 34 28 29 20 69 6e 20 65  eChangeP4() in e
8b40: 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73  ither of.** thos
8b50: 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e cases..*/.void
8b60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
8b70: 6e 64 50 34 28 56 64 62 65 20 2a 70 2c 20 76 6f  ndP4(Vdbe *p, vo
8b80: 69 64 20 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b  id *pP4, int n){
8b90: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
8ba0: 20 20 61 73 73 65 72 74 28 20 6e 21 3d 50 34 5f    assert( n!=P4_
8bb0: 49 4e 54 33 32 20 26 26 20 6e 21 3d 50 34 5f 56  INT32 && n!=P4_V
8bc0: 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TAB );.  assert(
8bd0: 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   n<=0 );.  if( p
8be0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8bf0: 65 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 34  ed ){.    freeP4
8c00: 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b  (p->db, n, pP4);
8c10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
8c20: 73 65 72 74 28 20 70 50 34 21 3d 30 20 29 3b 0a  sert( pP4!=0 );.
8c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
8c40: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 4f 70 20  Op>0 );.    pOp 
8c50: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
8c60: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
8c70: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
8c80: 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20 20 20 20  _NOTUSED );.    
8c90: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b  pOp->p4type = n;
8ca0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
8cb0: 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pP4;.  }.}../*.
8cc0: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
8cd0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8ce0: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
8cf0: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
8d00: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
8d10: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
8d20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
8d30: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
8d40: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
8d50: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
8d60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8d70: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
8d80: 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  fo;.  assert( v!
8d90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8da0: 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65  pIdx!=0 );.  pKe
8db0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
8dc0: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
8dd0: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 69  arse, pIdx);.  i
8de0: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 20 73 71  f( pKeyInfo ) sq
8df0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8e00: 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50  4(v, pKeyInfo, P
8e10: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
8e20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e30: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
8e40: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
8e50: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
8e60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8e70: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
8e80: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
8e90: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
8ea0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
8eb0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
8ec0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
8ed0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
8ee0: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
8ef0: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
8f00: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
8f10: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
8f20: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
8f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8f40: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
8f50: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
8f60: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
8f70: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
8f80: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
8f90: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
8fa0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
8fb0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
8fc0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
8fd0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
8fe0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
8ff0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
9000: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
9010: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9020: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
9030: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
9040: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
9050: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
9060: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
9070: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
9080: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
9090: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
90a0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
90b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
90c0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
90d0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
90e0: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
90f0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
9100: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
9110: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
9120: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
9130: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
9140: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
9150: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
9160: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
9170: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
9180: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
9190: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
91a0: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
91b0: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
91c0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
91d0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
91e0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
91f0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
9200: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
9210: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
9220: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
9230: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
9240: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
9250: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
9260: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
9270: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
9280: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
9290: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
92a0: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
92b0: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
92c0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
92d0: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
92e0: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
92f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
9300: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
9310: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9320: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
9330: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
9340: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
9350: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
9360: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
9370: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
9380: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
9390: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
93a0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
93b0: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
93c0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
93d0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
93e0: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
93f0: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
9400: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9410: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
9420: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
9430: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
9440: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
9450: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
9460: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
9470: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
9480: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
9490: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
94a0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
94b0: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
94c0: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
94d0: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
94e0: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
94f0: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
9500: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
9510: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
9520: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
9530: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
9540: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
9550: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
9560: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
9570: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
9580: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
9590: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
95a0: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
95b0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
95c0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
95d0: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
95e0: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
95f0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
9600: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
9610: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
9620: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
9630: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
9640: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
9650: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
9660: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
9670: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
9680: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
9690: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
96a0: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
96b0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
96c0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
96d0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
96e0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
96f0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
9700: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
9710: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
9720: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
9730: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9740: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
9750: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
9770: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
9780: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
9790: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
97a0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
97b0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
97c0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
97d0: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
97e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
97f0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
9800: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
9810: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
9820: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
9830: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
9840: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
9850: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
9860: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
9870: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
9880: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
9890: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
98a0: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
98b0: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
98c0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
98d0: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
98e0: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
98f0: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
9900: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
9910: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
9920: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
9930: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
9940: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
9950: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
9960: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
9970: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
9980: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
9990: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
99a0: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
99b0: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
99c0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
99d0: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
99e0: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
99f0: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
9a00: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
9a10: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
9a20: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
9a30: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
9a40: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
9a50: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
9a60: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
9a70: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
9a80: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
9a90: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
9aa0: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
9ab0: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
9ac0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
9ad0: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
9ae0: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
9af0: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
9b00: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
9b10: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
9b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
9b30: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
9b40: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
9b50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
9b60: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
9b70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9b80: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
9b90: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
9ba0: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
9bb0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
9bc0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
9bd0: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
9be0: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
9bf0: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
9c00: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
9c10: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
9c20: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
9c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
9c40: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
9c50: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
9c60: 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74 5b 35  j;.  char zAlt[5
9c70: 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  0];.  zOpName = 
9c80: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
9c90: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a  e(pOp->opcode);.
9ca0: 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    nOpName = sqli
9cb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e  te3Strlen30(zOpN
9cc0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e  ame);.  if( zOpN
9cd0: 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29  ame[nOpName+1] )
9ce0: 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f  {.    int seenCo
9cf0: 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  m = 0;.    char 
9d00: 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73  c;.    zSynopsis
9d10: 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f   = zOpName += nO
9d20: 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69  pName + 1;.    i
9d30: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
9d40: 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30  psis,"IF ",3)==0
9d50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
9d60: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
9d70: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20  TOREP2 ){.      
9d80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9d90: 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c  tf(sizeof(zAlt),
9da0: 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20   zAlt, "r[P2] = 
9db0: 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73  (%s)", zSynopsis
9dc0: 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +3);.      }else
9dd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9de0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
9df0: 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22  f(zAlt), zAlt, "
9e00: 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22 2c 20  if %s goto P2", 
9e10: 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20  zSynopsis+3);.  
9e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e      }.      zSyn
9e30: 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20  opsis = zAlt;.  
9e40: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a    }.    for(ii=j
9e50: 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20  j=0; jj<nTemp-1 
9e60: 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69  && (c = zSynopsi
9e70: 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29  s[ii])!=0; ii++)
9e80: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  {.      if( c=='
9e90: 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  P' ){.        c 
9ea0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69  = zSynopsis[++ii
9eb0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
9ec0: 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20  =='4' ){.       
9ed0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9ee0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
9ef0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50  emp+jj, "%s", zP
9f00: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
9f10: 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a  e if( c=='X' ){.
9f20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9f30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9f40: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
9f50: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
9f60: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
9f70: 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  eenCom = 1;.    
9f80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9f90: 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72       int v1 = tr
9fa0: 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29  anslateP(c, pOp)
9fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
9fc0: 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v2;.          sq
9fd0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9fe0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
9ff0: 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20  j, "%d", v1);.  
a000: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
a010: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
a020: 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20  +1, "@P", 2)==0 
a030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
a040: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  i += 3;.        
a050: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
a060: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
a070: 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  jj);.           
a080: 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v2 = translateP
a090: 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20  (zSynopsis[ii], 
a0a0: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
a0b0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
a0c0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31  ynopsis+ii+1,"+1
a0d0: 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
a0e0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32           ii += 2
a0f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a100: 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  v2++;.          
a110: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a120: 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20  if( v2>1 ){.    
a130: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a140: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
a150: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
a160: 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b  ..%d", v1+v2-1);
a170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
a180: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
a190: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a1a0: 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33  psis+ii+1, "..P3
a1b0: 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d  ", 4)==0 && pOp-
a1c0: 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p3==0 ){.      
a1d0: 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20        ii += 4;. 
a1e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a1f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20     }.        jj 
a200: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
a210: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
a220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a230: 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d     zTemp[jj++] =
a240: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
a250: 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43  }.    if( !seenC
a260: 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35  om && jj<nTemp-5
a270: 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e   && pOp->zCommen
a280: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
a290: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
a2a0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
a2b0: 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  "; %s", pOp->zCo
a2c0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a  mment);.      jj
a2d0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
a2e0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
a2f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c     }.    if( jj<
a300: 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a  nTemp ) zTemp[jj
a310: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  ] = 0;.  }else i
a320: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
a330: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a340: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
a350: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70  zTemp, "%s", pOp
a360: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
a370: 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72   jj = sqlite3Str
a380: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
a390: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70  }else{.    zTemp
a3a0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20  [0] = 0;.    jj 
a3b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a3c0: 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n jj;.}.#endif /
a3d0: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
a3e0: 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50  /..#if VDBE_DISP
a3f0: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65  LAY_P4 && define
a400: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a410: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a  CURSOR_HINTS)./*
a420: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68  .** Translate th
a430: 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65  e P4.pExpr value
a440: 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f   for an OP_Curso
a450: 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74  rHint opcode int
a460: 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63  o text.** that c
a470: 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20  an be displayed 
a480: 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e  in the P4 column
a490: 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70   of EXPLAIN outp
a4a0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ut..*/.static vo
a4b0: 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72  id displayP4Expr
a4c0: 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78  (StrAccum *p, Ex
a4d0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f  pr *pExpr){.  co
a4e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
a4f0: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
a500: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
a510: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
a520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a530: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 51 22 2c  appendf(p, "%Q",
a540: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
a550: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a560: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
a570: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
a580: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a590: 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
a5a0: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
a5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a5c0: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73  TK_NULL:.      s
a5d0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a5e0: 64 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  df(p, "NULL");. 
a5f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a600: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
a610: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a620: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
a630: 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d   "r[%d]", pExpr-
a640: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
a650: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a660: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
a670: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
a680: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
a690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6a0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a6b0: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
a6c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a6d0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a6e0: 64 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e  df(p, "c%d", (in
a6f0: 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  t)pExpr->iColumn
a700: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a720: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
a730: 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20     zOp = "LT";  
a740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a750: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
a760: 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  zOp = "LE";     
a770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a780: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70   TK_GT:      zOp
a790: 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72   = "GT";      br
a7a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a7b0: 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GE:      zOp = 
a7c0: 22 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GE";      break
a7d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
a7e0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45  :      zOp = "NE
a7f0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a800: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
a810: 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20      zOp = "EQ"; 
a820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a830: 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20  case TK_IS:     
a840: 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20   zOp = "IS";    
a850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a860: 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f  e TK_ISNOT:   zO
a870: 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62  p = "ISNOT";   b
a880: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a890: 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d  K_AND:     zOp =
a8a0: 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61   "AND";     brea
a8b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  k;.    case TK_O
a8c0: 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f  R:      zOp = "O
a8d0: 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R";      break;.
a8e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
a8f0: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22  :    zOp = "ADD"
a900: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a910: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20   case TK_STAR:  
a920: 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20    zOp = "MUL";  
a930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a940: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a  se TK_MINUS:   z
a950: 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20  Op = "SUB";     
a960: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a970: 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20  TK_REM:     zOp 
a980: 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65  = "REM";     bre
a990: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a9a0: 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22  BITAND:  zOp = "
a9b0: 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b  BITAND";  break;
a9c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a9d0: 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54  OR:   zOp = "BIT
a9e0: 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OR";   break;.  
a9f0: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
aa00: 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20     zOp = "DIV"; 
aa10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
aa20: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20  ase TK_LSHIFT:  
aa30: 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  zOp = "LSHIFT"; 
aa40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
aa50: 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70   TK_RSHIFT:  zOp
aa60: 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72   = "RSHIFT";  br
aa70: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
aa80: 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20  _CONCAT:  zOp = 
aa90: 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b  "CONCAT";  break
aaa0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ;.    case TK_UM
aab0: 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49  INUS:  zOp = "MI
aac0: 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  NUS";   break;. 
aad0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
aae0: 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22  :   zOp = "PLUS"
aaf0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
ab00: 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
ab10: 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b   zOp = "BITNOT";
ab20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ab30: 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f  e TK_NOT:     zO
ab40: 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62  p = "NOT";     b
ab50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
ab60: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d  K_ISNULL:  zOp =
ab70: 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61   "ISNULL";  brea
ab80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
ab90: 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e  OTNULL: zOp = "N
aba0: 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
abb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
abc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
abd0: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 22 2c  appendf(p, "%s",
abe0: 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20   "expr");.      
abf0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
ac00: 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  ( zOp ){.    sql
ac10: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
ac20: 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b  (p, "%s(", zOp);
ac30: 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78  .    displayP4Ex
ac40: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pr(p, pExpr->pLe
ac50: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ft);.    if( pEx
ac60: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
ac70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ac80: 61 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  append(p, ",", 1
ac90: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
aca0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
acb0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
acc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
acd0: 61 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31  append(p, ")", 1
ace0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
acf0: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
ad00: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
ad10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
ad20: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
ad30: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
ad40: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
ad50: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
ad60: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
ad70: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
ad80: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
ad90: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
ada0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
adb0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
adc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
add0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
ade0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
adf0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
ae00: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
ae10: 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20    StrAccum x;.  
ae20: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
ae30: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  0 );.  sqlite3St
ae40: 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30  rAccumInit(&x, 0
ae50: 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20  , zTemp, nTemp, 
ae60: 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  0);.  switch( pO
ae70: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
ae80: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
ae90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  : {.      int j;
aea0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
aeb0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
aec0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
aed0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
aee0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
aef0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
af00: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
af10: 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  &x, "k(%d", pKey
af20: 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29  Info->nKeyField)
af30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
af40: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65   j<pKeyInfo->nKe
af50: 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  yField; j++){.  
af60: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
af70: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
af80: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
af90: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
afa0: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
afb0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  Coll->zName : ""
afc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
afd0: 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e  rcmp(zColl, "BIN
afe0: 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c  ARY")==0 ) zColl
aff0: 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20   = "B";.        
b000: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b010: 6e 64 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c  ndf(&x, ",%s%s",
b020: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b030: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
b040: 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a  Order[j] ? "-" :
b050: 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20   "", zColl);.   
b060: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b070: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78  e3_str_append(&x
b080: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ")", 1);.     
b090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b0a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b0b0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
b0c0: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
b0d0: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
b0e0: 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d  yP4Expr(&x, pOp-
b0f0: 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  >p4.pExpr);.    
b100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b110: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
b120: 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20  4_COLLSEQ: {.   
b130: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
b140: 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c  l = pOp->p4.pCol
b150: 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
b160: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b170: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c   "(%.20s)", pCol
b180: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
b190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b1a0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
b1b0: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
b1c0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
b1d0: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
b1e0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b1f0: 6e 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22  ndf(&x, "%s(%d)"
b200: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
b210: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
b220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b230: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b240: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
b250: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
b260: 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  ).    case P4_FU
b270: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46  NCCTX: {.      F
b280: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
b290: 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75  Op->p4.pCtx->pFu
b2a0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
b2b0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b2c0: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
b2d0: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
b2e0: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
b2f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b300: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
b310: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
b320: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b330: 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  x, "%lld", *pOp-
b340: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
b350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b360: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
b370: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b380: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b390: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
b3a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b3b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b3c0: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
b3d0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b3e0: 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ndf(&x, "%.16g",
b3f0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
b400: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b410: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b420: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
b430: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
b440: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66  4.pMem;.      if
b450: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b460: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
b470: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
b480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b490: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b4a0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
b4b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b4c0: 70 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64  ppendf(&x, "%lld
b4d0: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20  ", pMem->u.i);. 
b4e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b4f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
b500: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Real ){.       
b510: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b520: 65 6e 64 66 28 26 78 2c 20 22 25 2e 31 36 67 22  endf(&x, "%.16g"
b530: 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20  , pMem->u.r);.  
b540: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
b550: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b560: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
b570: 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20  zP4 = "NULL";.  
b580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b590: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
b5a0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
b5b0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
b5c0: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
b5d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
b5e0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b5f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b600: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
b610: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
b620: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
b630: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
b640: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
b650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b660: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 76 74  _appendf(&x, "vt
b670: 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a  ab:%p", pVtab);.
b680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b690: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
b6a0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
b6b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
b6c0: 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70       int *ai = p
b6d0: 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
b6e0: 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20   int n = ai[0]; 
b6f0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65    /* The first e
b700: 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54  lement of an INT
b710: 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20  ARRAY is always 
b720: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
b730: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f             ** co
b740: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
b750: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f  r of elements to
b760: 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20   follow */.     
b770: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20   for(i=1; i<=n; 
b780: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
b790: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b7a0: 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b  f(&x, ",%d", ai[
b7b0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
b7c0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b     zTemp[0] = '[
b7d0: 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ';.      sqlite3
b7e0: 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20  _str_append(&x, 
b7f0: 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  "]", 1);.      b
b800: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b810: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
b820: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
b830: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b840: 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  &x, "program");.
b850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b860: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44   }.    case P4_D
b870: 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65  YNBLOB:.    case
b880: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
b890: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
b8a0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
b8b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b8c0: 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  4_TABLE: {.     
b8d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b8e0: 65 6e 64 66 28 26 78 2c 20 22 25 73 22 2c 20 70  endf(&x, "%s", p
b8f0: 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61  Op->p4.pTab->zNa
b900: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
b910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
b920: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
b930: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
b940: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
b950: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
b960: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
b970: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
b980: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b990: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
b9a0: 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73  Finish(&x);.  as
b9b0: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
b9c0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
b9d0: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
b9e0: 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a  ISPLAY_P4 */../*
b9f0: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
ba00: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
ba10: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
ba20: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
ba30: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  sed..**.** The p
ba40: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
ba50: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
ba60: 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63  in advance the c
ba70: 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a  omplete set of.*
ba80: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
ba90: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ases that will b
baa0: 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f  e use.  A mask o
bab0: 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65  f these database
bac0: 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e  s.** is maintain
bad0: 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ed in p->btreeMa
bae0: 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b  sk.  The p->lock
baf0: 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68  Mask value is th
bb00: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70  e subset of.** p
bb10: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64  ->btreeMask of d
bb20: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
bb30: 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63  ll require a loc
bb40: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
bb50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
bb60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
bb70: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
bb80: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
bb90: 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  && i<(int)sizeof
bba0: 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  (yDbMask)*8 );. 
bbb0: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
bbc0: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
bbd0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61  ask)*8 );.  DbMa
bbe0: 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61  skSet(p->btreeMa
bbf0: 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21  sk, i);.  if( i!
bc00: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
bc10: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
bc20: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
bc30: 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
bc40: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a  ->lockMask, i);.
bc50: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
bc60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bc70: 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a  SHARED_CACHE)./*
bc80: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
bc90: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70   compiled to sup
bca0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
bcb0: 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65  e mode and to be
bcc0: 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20   threadsafe,.** 
bcd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74  this routine obt
bce0: 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61  ains the mutex a
bcf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
bd00: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
bd10: 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d  ucture.** that m
bd20: 61 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62  ay be accessed b
bd30: 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
bd40: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
bd50: 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61  In doing so it a
bd60: 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  lso.** sets the 
bd70: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
bd80: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
bd90: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
bda0: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
bdb0: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
bdc0: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
bdd0: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
bde0: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
bdf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
be00: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
be10: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
be20: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
be30: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
be40: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
be50: 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  r() is invoked t
be60: 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72  o set the BtShar
be70: 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a  ed.db variables.
be80: 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53  ** of all of BtS
be90: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
bea0: 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20   accessible via 
beb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
bec0: 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74  dle .** associat
bed0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a  ed with the VM..
bee0: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
bef0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
bf00: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73  e and does not s
bf10: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
bf20: 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a  che mode, this.*
bf30: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
bf40: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
bf50: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69   p->btreeMask fi
bf60: 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b  eld is a bitmask
bf70: 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74   of all btrees t
bf80: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
bf90: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70   .** statement p
bfa0: 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20   will ever use. 
bfb0: 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75   Let N be the nu
bfc0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
bfd0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20  p->btreeMask.** 
bfe0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
bff0: 20 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65   btrees that use
c000: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
c010: 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65  Then the runtime
c020: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   of.** this rout
c030: 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74  ine is N*N.  But
c040: 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20   as N is rarely 
c050: 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69  more than 1, thi
c060: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  s should not.** 
c070: 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
c080: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c090: 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b  eEnter(Vdbe *p){
c0a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
c0b0: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
c0c0: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
c0d0: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
c0e0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
c0f0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
c100: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
c110: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
c120: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
c130: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
c140: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
c150: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
c160: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
c170: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
c180: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
c190: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
c1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
c1b0: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42  eEnter(aDb[i].pB
c1c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
c1d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
c1e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c1f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
c200: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
c210: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  AFE>0./*.** Unlo
c220: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74  ck all of the bt
c230: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20  rees previously 
c240: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c  locked by a call
c250: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
c260: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  nter()..*/.stati
c270: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
c280: 45 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65  E void vdbeLeave
c290: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c2a0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
c2b0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
c2c0: 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20  int nDb;.  db = 
c2d0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
c2e0: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
c2f0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
c300: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
c310: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
c320: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
c330: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
c340: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
c350: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
c360: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
c370: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
c380: 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
c390: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
c3a0: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62  be *p){.  if( Db
c3b0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
c3c0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
c3d0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
c3e0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65  n case */.  vdbe
c3f0: 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64  Leave(p);.}.#end
c400: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
c410: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
c420: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c430: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
c440: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
c450: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
c460: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
c470: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
c480: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c490: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
c4a0: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 56 64 62  Out, int pc, Vdb
c4b0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61  eOp *pOp){.  cha
c4c0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
c4d0: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
c4e0: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
c4f0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c500: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
c510: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
c520: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
c530: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
c540: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
c550: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
c560: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
c570: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
c580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c590: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
c5a0: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
c5b0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
c5c0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
c5d0: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
c5e0: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
c5f0: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
c600: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
c610: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
c620: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
c630: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
c640: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
c650: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
c660: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
c670: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
c680: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
c690: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
c6a0: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
c6b0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
c6c0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
c6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
c6e0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
c6f0: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
c700: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
c710: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
c720: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
c730: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
c740: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c750: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 61 72 72  nitialize an arr
c760: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
c770: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
c780: 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  oid initMemArray
c790: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20  (Mem *p, int N, 
c7a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36  sqlite3 *db, u16
c7b0: 20 66 6c 61 67 73 29 7b 0a 20 20 77 68 69 6c 65   flags){.  while
c7c0: 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20  ( (N--)>0 ){.   
c7d0: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20   p->db = db;.   
c7e0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
c7f0: 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c  s;.    p->szMall
c800: 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  oc = 0;.#ifdef S
c810: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
c820: 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  p->pScopyFrom = 
c830: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2b  0;.#endif.    p+
c840: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
c850: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
c860: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
c870: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
c880: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
c890: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
c8a0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
c8b0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
c8c0: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
c8d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
c8e0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
c8f0: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
c900: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
c910: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
c920: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
c930: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
c940: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
c950: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
c960: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c970: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
c980: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
c990: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
c9a0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
c9b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c9c0: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
c9d0: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
c9e0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
c9f0: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
ca00: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
ca10: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
ca20: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
ca30: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
ca40: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
ca50: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
ca60: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
ca70: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
ca80: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
ca90: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
caa0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
cab0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
cac0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
cad0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
cae0: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
caf0: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
cb00: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
cb10: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
cb20: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
cb30: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
cb40: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
cb50: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
cb60: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
cb70: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
cb80: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
cb90: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
cba0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
cbb0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
cbc0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
cbd0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
cbe0: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
cbf0: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
cc00: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
cc10: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
cc20: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
cc30: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
cc40: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
cc50: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
cc60: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
cc70: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
cc80: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
cc90: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
cca0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
ccb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
ccc0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
ccd0: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
cce0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
ccf0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
cd00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
cd10: 65 28 20 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69  e( p->xDel==sqli
cd20: 74 65 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44  te3VdbeFrameMemD
cd30: 65 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  el );.      if( 
cd40: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
cd50: 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20  g|MEM_Dyn) ){.  
cd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd70: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
cd80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cd90: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
cda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
cdb0: 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d  FreeNN(db, p->zM
cdc0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
cdd0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
cde0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
cdf0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
ce00: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
ce10: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
ce20: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65   );.  }.}..#ifde
ce30: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
ce40: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
ce50: 20 70 46 72 61 6d 65 20 69 73 20 61 20 76 61 6c   pFrame is a val
ce60: 69 64 20 56 64 62 65 46 72 61 6d 65 20 70 6f 69  id VdbeFrame poi
ce70: 6e 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 72  nter.  Return tr
ce80: 75 65 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 61  ue if it is.** a
ce90: 6e 64 20 66 61 6c 73 65 20 69 66 20 73 6f 6d 65  nd false if some
cea0: 74 68 69 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a  thing is wrong..
ceb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
cec0: 6e 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 66  ne is intended f
ced0: 6f 72 20 75 73 65 20 69 6e 73 69 64 65 20 6f 66  or use inside of
cee0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
cef0: 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ents only..*/.in
cf00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
cf10: 6d 65 49 73 56 61 6c 69 64 28 56 64 62 65 46 72  meIsValid(VdbeFr
cf20: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
cf30: 69 66 28 20 70 46 72 61 6d 65 2d 3e 69 46 72 61  if( pFrame->iFra
cf40: 6d 65 4d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  meMagic!=SQLITE_
cf50: 46 52 41 4d 45 5f 4d 41 47 49 43 20 29 20 72 65  FRAME_MAGIC ) re
cf60: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
cf70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   1;.}.#endif.../
cf80: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
cf90: 65 73 74 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d  estructor on a M
cfa0: 65 6d 20 6f 62 6a 65 63 74 20 28 77 68 69 63 68  em object (which
cfb0: 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 73 71   is really an sq
cfc0: 6c 69 74 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20  lite3_value).** 
cfd0: 74 68 61 74 20 64 65 6c 65 74 65 73 20 74 68 65  that deletes the
cfe0: 20 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 74 68   Frame object th
cff0: 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74  at is attached t
d000: 6f 20 69 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a  o it as a blob..
d010: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d020: 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65  ne does not dele
d030: 74 65 20 74 68 65 20 46 72 61 6d 65 20 72 69 67  te the Frame rig
d040: 68 74 20 61 77 61 79 2e 20 20 49 74 20 6d 65 72  ht away.  It mer
d050: 65 6c 79 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ely adds the.** 
d060: 66 72 61 6d 65 20 74 6f 20 61 20 6c 69 73 74 20  frame to a list 
d070: 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 62 65 20  of frames to be 
d080: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
d090: 20 56 64 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a   Vdbe halts..*/.
d0a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
d0b0: 46 72 61 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64  FrameMemDel(void
d0c0: 20 2a 70 41 72 67 29 7b 0a 20 20 56 64 62 65 46   *pArg){.  VdbeF
d0d0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 20 3d 20 28  rame *pFrame = (
d0e0: 56 64 62 65 46 72 61 6d 65 2a 29 70 41 72 67 3b  VdbeFrame*)pArg;
d0f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d100: 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c  e3VdbeFrameIsVal
d110: 69 64 28 70 46 72 61 6d 65 29 20 29 3b 0a 20 20  id(pFrame) );.  
d120: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20  pFrame->pParent 
d130: 3d 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65  = pFrame->v->pDe
d140: 6c 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65  lFrame;.  pFrame
d150: 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d  ->v->pDelFrame =
d160: 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a   pFrame;.}.../*.
d170: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
d180: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
d190: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
d1a0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
d1b0: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
d1c0: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
d1d0: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
d1e0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
d1f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d200: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
d210: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
d220: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
d230: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
d240: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
d250: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
d260: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
d270: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
d280: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d290: 74 65 33 56 64 62 65 46 72 61 6d 65 49 73 56 61  te3VdbeFrameIsVa
d2a0: 6c 69 64 28 70 29 20 29 3b 0a 20 20 66 6f 72 28  lid(p) );.  for(
d2b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64  i=0; i<p->nChild
d2c0: 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Csr; i++){.    s
d2d0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d2e0: 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72  rsor(p->v, apCsr
d2f0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  [i]);.  }.  rele
d300: 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d  aseMemArray(aMem
d310: 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b  , p->nChildMem);
d320: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
d330: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76  leteAuxData(p->v
d340: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
d350: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71  ta, -1, 0);.  sq
d360: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76  lite3DbFree(p->v
d370: 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66  ->db, p);.}..#if
d380: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d390: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47  _EXPLAIN./*.** G
d3a0: 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  ive a listing of
d3b0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20   the program in 
d3c0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
d3d0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
d3e0: 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20  nterface is the 
d3f0: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56  same as sqlite3V
d400: 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20  dbeExec().  But 
d410: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75  instead of.** ru
d420: 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20  nning the code, 
d430: 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  it invokes the c
d440: 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72  allback once for
d450: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
d460: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75  n..** This featu
d470: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  re is used to im
d480: 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e  plement "EXPLAIN
d490: 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  "..**.** When p-
d4a0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63  >explain==1, eac
d4b0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  h instruction is
d4c0: 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a   listed.  When.*
d4d0: 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c  * p->explain==2,
d4e0: 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e   only OP_Explain
d4f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
d500: 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65  e listed and the
d510: 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20  se.** are shown 
d520: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66  in a different f
d530: 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61  ormat.  p->expla
d540: 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f  in==2 is used to
d550: 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58   implement.** EX
d560: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
d570: 2e 0a 2a 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a  ..** 2018-04-24:
d580: 20 20 49 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d    In p->explain=
d590: 3d 32 20 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f  =2 mode, the OP_
d5a0: 49 6e 69 74 20 6f 70 63 6f 64 65 73 20 6f 66 20  Init opcodes of 
d5b0: 74 72 69 67 67 65 72 73 0a 2a 2a 20 61 72 65 20  triggers.** are 
d5c0: 61 6c 73 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74  also shown, so t
d5d0: 68 61 74 20 74 68 65 20 62 6f 75 6e 64 61 72 69  hat the boundari
d5e0: 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 6d  es between the m
d5f0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a  ain program and.
d600: 2a 2a 20 65 61 63 68 20 74 72 69 67 67 65 72 20  ** each trigger 
d610: 61 72 65 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a  are clear..**.**
d620: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
d630: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
d640: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
d650: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
d660: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
d670: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
d680: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
d690: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
d6a0: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
d6b0: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
d6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d6d0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
d6e0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
d710: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
d720: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
d730: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
d760: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
d770: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
d780: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7a0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
d7b0: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
d7c0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d7e0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
d7f0: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
d800: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
d810: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d830: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
d840: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
d850: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d880: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
d890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8b0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d8c0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
d8d0: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
d8e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
d8f0: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
d900: 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 69 73 74 53   */.  int bListS
d910: 75 62 70 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78  ubprogs = (p->ex
d920: 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d  plain==1 || (db-
d930: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
d940: 54 72 69 67 67 65 72 45 51 50 29 21 3d 30 29 3b  TriggerEQP)!=0);
d950: 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a  .  Op *pOp = 0;.
d960: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
d970: 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72  plain );.  asser
d980: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
d990: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20  E_MAGIC_RUN );. 
d9a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
d9b0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
d9c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
d9d0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
d9e0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20  _NOMEM );..  /* 
d9f0: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
da00: 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74   opcode does not
da10: 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72   use dynamic str
da20: 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ings for.  ** th
da30: 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74  e result, result
da40: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63   columns may bec
da50: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74  ome dynamic if t
da60: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20  he user calls.  
da70: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
da80: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73  n_text16(), caus
da90: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f  ing a translatio
daa0: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f  n to UTF-16 enco
dab0: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  ding..  */.  rel
dac0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65  easeMemArray(pMe
dad0: 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73  m, 8);.  p->pRes
dae0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69  ultSet = 0;..  i
daf0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
db00: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
db10: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
db20: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69   a malloc() insi
db30: 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  de a call to sql
db40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
db50: 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  () or.    ** sql
db60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
db70: 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f  16() failed.  */
db80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
db90: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65  ault(db);.    re
dba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
dbb0: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  R;.  }..  /* Whe
dbc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
dbd0: 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63  output rows reac
dbe0: 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d  hes nRow, that m
dbf0: 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69  eans the.  ** li
dc00: 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68  sting has finish
dc10: 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73  ed and sqlite3_s
dc20: 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74  tep() should ret
dc30: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
dc40: 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68  .  ** nRow is th
dc50: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
dc60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
dc70: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c  he main program,
dc80: 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73   plus.  ** the s
dc90: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
dca0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20   of rows in all 
dcb0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
dcc0: 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a  ams encountered.
dcd0: 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68    ** so far.  Th
dce0: 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c  e nRow value wil
dcf0: 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65  l increase as ne
dd00: 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  w trigger subpro
dd10: 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65  grams are.  ** e
dd20: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20  ncountered, but 
dd30: 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74  p->pc will event
dd40: 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74  ually catch up t
dd50: 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e  o nRow..  */.  n
dd60: 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  Row = p->nOp;.  
dd70: 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67  if( bListSubprog
dd80: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  s ){.    /* The 
dd90: 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63  first 8 memory c
dda0: 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f  ells are used fo
ddb0: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
ddc0: 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20  .  So we will.  
ddd0: 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20    ** commandeer 
dde0: 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20  the 9th cell to 
ddf0: 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66  use as storage f
de00: 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  or an array of p
de10: 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74  ointers.    ** t
de20: 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  o trigger subpro
de30: 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45  grams.  The VDBE
de40: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
de50: 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20  o have at least 
de60: 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20  9.    ** cells. 
de70: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
de80: 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20  p->nMem>9 );.   
de90: 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d   pSub = &p->aMem
dea0: 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75  [9];.    if( pSu
deb0: 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  b->flags&MEM_Blo
dec0: 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  b ){.      /* On
ded0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
dee0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
def0: 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c  ), pSub will hol
df00: 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73  d a NULL.  It is
df10: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  .      ** initia
df20: 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20  lized to a BLOB 
df30: 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f  by the P4_SUBPRO
df40: 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20  GRAM processing 
df50: 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20  logic below */. 
df60: 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62       nSub = pSub
df70: 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a  ->n/sizeof(Vdbe*
df80: 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d  );.      apSub =
df90: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
dfa0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20  pSub->z;.    }. 
dfb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
dfc0: 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; i++){.      
dfd0: 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d  nRow += apSub[i]
dfe0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->nOp;.    }.  }
dff0: 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b 20 20 2f  ..  while(1){  /
e000: 2a 20 4c 6f 6f 70 20 65 78 69 74 73 20 76 69 61  * Loop exits via
e010: 20 62 72 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20   break */.    i 
e020: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69  = p->pc++;.    i
e030: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
e040: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
e050: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20  TE_OK;.      rc 
e060: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
e070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e080: 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  }.    if( i<p->n
e090: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
e0a0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
e0b0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
e0c0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
e0d0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
e0e0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
e0f0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
e100: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
e110: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e120: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
e130: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
e140: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
e150: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
e160: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
e170: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
e180: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
e190: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
e1a0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
e1b0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e1c0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
e1d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
e1e0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
e1f0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
e200: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
e210: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
e220: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e  ..    /* When an
e230: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
e240: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
e250: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
e260: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a 2a   that has.    **
e270: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
e280: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
e290: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
e2a0: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
e2b0: 72 6f 67 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b  rograms.    ** k
e2c0: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
e2d0: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
e2e0: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
e2f0: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
e300: 72 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61  rogram.    ** ha
e310: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
e320: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a  en seen..    */.
e330: 20 20 20 20 69 66 28 20 62 4c 69 73 74 53 75 62      if( bListSub
e340: 70 72 6f 67 73 20 26 26 20 70 4f 70 2d 3e 70 34  progs && pOp->p4
e350: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
e360: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  RAM ){.      int
e370: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
e380: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
e390: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
e3a0: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
e3b0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
e3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53  .        if( apS
e3d0: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
e3e0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
e3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e400: 66 28 20 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20  f( j==nSub ){.  
e410: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
e420: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
e430: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
e440: 75 62 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ub!=0);.        
e450: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
e460: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e470: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
e480: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ROR;.          b
e490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
e4a0: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
e4b0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
e4c0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
e4d0: 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20  apSub[nSub++] = 
e4e0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
e4f0: 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
e500: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
e510: 62 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  b;.        pSub-
e520: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
e530: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
e540: 20 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70         nRow += p
e550: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d  Op->p4.pProgram-
e560: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
e570: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
e580: 78 70 6c 61 69 6e 3c 32 20 29 20 62 72 65 61 6b  xplain<2 ) break
e590: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
e5a0: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
e5b0: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
e5c0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
e5d0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 2d 3e 70 63  OP_Init && p->pc
e5e0: 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  >1 ) break;.  }.
e5f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e600: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
e610: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
e620: 70 74 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  pted ){.      p-
e630: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
e640: 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 63  ERRUPT;.      rc
e650: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e670: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
e680: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
e690: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e6a0: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
e6b0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
e6c0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  in==1 ){.       
e6d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e6e0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20  EM_Int;.        
e6f0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e720: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
e730: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   */.        pMem
e740: 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20  ++;.    .       
e750: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e760: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
e770: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
e780: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
e790: 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f  har*)sqlite3Opco
e7a0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
e7b0: 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  de); /* Opcode *
e7c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
e7d0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
e7e0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
e7f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e800: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
e810: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
e820: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
e830: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
e840: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d     }..      pMem
e850: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e860: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
e870: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
e8a0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
e8b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e8c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e8d0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
e8e0: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 70  /* P2 */.      p
e910: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d  Mem++;..      pM
e920: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e930: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
e940: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
e970: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
e980: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
e990: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
e9a0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
e9b0: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
e9c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e9d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e9e0: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
e9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ea00: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
ea10: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ea20: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ea30: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 64 69 73  .      zP4 = dis
ea40: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
ea50: 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  ->z, pMem->szMal
ea60: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  loc);.      if( 
ea70: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
ea80: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
ea90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
eaa0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
eab0: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
eac0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
ead0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eae0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eaf0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
eb00: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
eb10: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
eb20: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
eb30: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
eb40: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
eb50: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  }.      pMem++;.
eb60: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78  .      if( p->ex
eb70: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
eb80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
eb90: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
eba0: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b  size(pMem, 4) ){
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ebc0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
ebd0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ebf0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
ec00: 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   }.        pMem-
ec10: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
ec20: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
ec30: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
ec40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ec50: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
ec60: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
ec70: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
ec80: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
ec90: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
eca0: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  8;.        pMem+
ecb0: 2b 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53  +;.    .#ifdef S
ecc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
ecd0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
ece0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ecf0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
ed00: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
ed10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
ed20: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
ed30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ed40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ed50: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
ed60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
ed70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ed80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ed90: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
eda0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
edb0: 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e  pOp, zP4, pMem->
edc0: 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 20  z, 500);.       
edd0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
ede0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
edf0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
ee00: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
ee30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   */.#endif.     
ee40: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65   }..      p->nRe
ee50: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a  sColumn = 8 - 4*
ee60: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
ee70: 20 20 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74        p->pResult
ee80: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
ee90: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ];.      p->rc =
eea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
eeb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
eec0: 57 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  W;.    }.  }.  r
eed0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
eee0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
eef0: 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
ef00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
ef10: 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  G./*.** Print th
ef20: 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75  e SQL that was u
ef30: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
ef40: 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a  a VDBE program..
ef50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ef60: 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65  dbePrintSql(Vdbe
ef70: 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   *p){.  const ch
ef80: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28  ar *z = 0;.  if(
ef90: 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
efa0: 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d  z = p->zSql;.  }
efb0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  else if( p->nOp>
efc0: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
efd0: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70  VdbeOp *pOp = &p
efe0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66  ->aOp[0];.    if
eff0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
f000: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
f010: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  4.z!=0 ){.      
f020: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
f030: 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
f040: 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29  te3Isspace(*z) )
f050: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   z++;.    }.  }.
f060: 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66    if( z ) printf
f070: 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ("SQL: [%s]\n", 
f080: 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  z);.}.#endif..#i
f090: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f0a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
f0b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
f0c0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
f0d0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49  /*.** Print an I
f0e0: 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73  OTRACE message s
f0f0: 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65  howing SQL conte
f100: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
f110: 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71  te3VdbeIOTraceSq
f120: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
f130: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
f140: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
f150: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72   if( sqlite3IoTr
f160: 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ace==0 ) return;
f170: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
f180: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
f190: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
f1a0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
f1b0: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
f1c0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
f1d0: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
f1e0: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
f1f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
f200: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
f210: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
f220: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
f230: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
f240: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
f250: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
f260: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f270: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
f280: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
f290: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
f2a0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
f2b0: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
f2c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f2d0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
f2e0: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
f2f0: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
f300: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
f310: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
f320: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
f330: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
f340: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
f350: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
f360: 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /../* An instanc
f370: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
f380: 20 64 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20   describes bulk 
f390: 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  memory available
f3a0: 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73   for use.** by s
f3b0: 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20  ubcomponents of 
f3c0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
f3d0: 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20  ment.  Space is 
f3e0: 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a  allocated out.**
f3f0: 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65 53 70   of a ReusableSp
f400: 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68  ace object by th
f410: 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72  e allocSpace() r
f420: 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f  outine below..*/
f430: 0a 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65  .struct Reusable
f440: 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53  Space {.  u8 *pS
f450: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f  pace;          /
f460: 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  * Available memo
f470: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  ry */.  int nFre
f480: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
f490: 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  Bytes of availab
f4a0: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
f4b0: 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20  nt nNeeded;     
f4c0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74      /* Total byt
f4d0: 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f  es that could no
f4e0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  t be allocated *
f4f0: 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20  /.};../* Try to 
f500: 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  allocate nByte b
f510: 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61  ytes of 8-byte a
f520: 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f  ligned bulk memo
f530: 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66  ry for pBuf.** f
f540: 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65  rom the Reusable
f550: 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52  Space object.  R
f560: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
f570: 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
f580: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75  .** memory on su
f590: 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66  ccess.  If insuf
f5a0: 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69  ficient memory i
f5b0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  s available in t
f5c0: 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70  he.** ReusableSp
f5d0: 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72  ace object, incr
f5e0: 65 61 73 65 20 74 68 65 20 52 65 75 73 61 62 6c  ease the Reusabl
f5f0: 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a  eSpace.nNeeded.*
f600: 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65 20 61  * value by the a
f610: 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64  mount needed and
f620: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
f630: 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e  .** If pBuf is n
f640: 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ot initially NUL
f650: 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  L, that means th
f660: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61  at the memory ha
f670: 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
f680: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61  n allocated by a
f690: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74   prior call to t
f6a0: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20  his routine, so 
f6b0: 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f  just return a co
f6c0: 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e  py.** of pBuf an
f6d0: 64 20 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65  d leave Reusable
f6e0: 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e  Space unchanged.
f6f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f  .**.** This allo
f700: 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65  cator is employe
f710: 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75  d to repurpose u
f720: 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74  nused slots at t
f730: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
f740: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66   opcode array of
f750: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 20   prepared state 
f760: 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79  for other memory
f770: 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20 70 72   needs of the pr
f780: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
f790: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
f7a0: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
f7b0: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
f7c0: 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20  leSpace *p,  /* 
f7d0: 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  Bulk memory avai
f7e0: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
f7f0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
f800: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
f810: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f820: 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61  o a prior alloca
f830: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  tion */.  int nB
f840: 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
f850: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
f860: 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f  memory needed */
f870: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
f880: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
f890: 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b  NT(p->pSpace) );
f8a0: 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
f8b0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f  {.    nByte = RO
f8c0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20  UND8(nByte);.   
f8d0: 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d   if( nByte <= p-
f8e0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  >nFree ){.      
f8f0: 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  p->nFree -= nByt
f900: 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  e;.      pBuf = 
f910: 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46  &p->pSpace[p->nF
f920: 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ree];.    }else{
f930: 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65  .      p->nNeede
f940: 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  d += nByte;.    
f950: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
f960: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
f970: 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20  MENT(pBuf) );.  
f980: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
f990: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
f9a0: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
f9b0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
f9c0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
f9d0: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
f9e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f9f0: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
fa00: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
fa10: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
fa20: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
fa30: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
fa40: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
fa50: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fa60: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
fa70: 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d  MAGIC_INIT || p-
fa80: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
fa90: 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f  IC_RESET );..  /
faa0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
fab0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
fac0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
fad0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
fae0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
faf0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
fb00: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
fb10: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
fb20: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
fb30: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
fb40: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fb50: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
fb60: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
fb70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
fb80: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
fb90: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
fba0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
fbb0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
fbc0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
fbd0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
fbe0: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
fbf0: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
fc00: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
fc10: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
fc20: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
fc30: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
fc40: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
fc50: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
fc60: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
fc70: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
fc80: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
fc90: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
fca0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
fcb0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
fcc0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
fcd0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fce0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
fcf0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
fd00: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
fd10: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
fd20: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
fd30: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
fd40: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
fd50: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
fd60: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
fd70: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
fd80: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
fd90: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
fda0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
fdb0: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
fdc0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
fdd0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
fde0: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
fdf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
fe00: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
fe10: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
fe20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fe30: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
fe40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
fe50: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
fe60: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
fe70: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
fe80: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
fe90: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fea0: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
feb0: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
fec0: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
fed0: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
fee0: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
fef0: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
ff00: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
ff10: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
ff20: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
ff30: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
ff40: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
ff50: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
ff60: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
ff70: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
ff80: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
ff90: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
ffa0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
ffb0: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
ffc0: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
ffd0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
ffe0: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
fff0: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
10000 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
10010 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
10020 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
10030 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
10060 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
10070 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
10080 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10090 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
100a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
100d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
100e0 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
10110 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
10120 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
10130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10140 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
10150 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
10160 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
10190 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
101a0 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
101d0 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
101e0 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
101f0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10210 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10220 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
10230 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20  Space x;        
10240 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b  /* Reusable bulk
10250 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73   memory */..  as
10260 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
10270 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
10280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10290 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
102a0 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
102b0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
102c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
102d0 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
102e0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
102f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
10300 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
10310 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
10320 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
10330 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10340 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
10350 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
10360 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
10370 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63  ;.  .  /* Each c
10380 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d  ursor uses a mem
10390 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66  ory cell.  The f
103a0 69 72 73 74 20 63 75 72 73 6f 72 20 28 63 75 72  irst cursor (cur
103b0 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20  sor 0) can.  ** 
103c0 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63  use aMem[0] whic
103d0 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  h is not otherwi
103e0 73 65 20 75 73 65 64 20 62 79 20 74 68 65 20 56  se used by the V
103f0 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c  DBE program.  Al
10400 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63  locate.  ** spac
10410 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
10420 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f  aMem[] for curso
10430 72 73 20 31 20 61 6e 64 20 67 72 65 61 74 65 72  rs 1 and greater
10440 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  ..  ** See also:
10450 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
10460 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
10470 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  = nCursor;.  if(
10480 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e   nCursor==0 && n
10490 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20  Mem>0 ) nMem++; 
104a0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d   /* Space for aM
104b0 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f  em[0] even if no
104c0 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  t used */..  /* 
104d0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
104e0 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d  uch reusable mem
104f0 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ory is available
10500 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10510 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61  he.  ** opcode a
10520 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72  rray.  This extr
10530 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  a memory will be
10540 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72   reallocated for
10550 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a   other elements.
10560 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70    ** of the prep
10570 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
10580 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44    */.  n = ROUND
10590 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e  8(sizeof(Op)*p->
105a0 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20  nOp);           
105b0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f     /* Bytes of o
105c0 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65  pcode memory use
105d0 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20  d */.  x.pSpace 
105e0 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29  = &((u8*)p->aOp)
105f0 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [n];            
10600 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63     /* Unused opc
10610 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ode memory */.  
10620 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
10630 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70  TE_ALIGNMENT(x.p
10640 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46  Space) );.  x.nF
10650 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38  ree = ROUNDDOWN8
10660 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c  (pParse->szOpAll
10670 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74  oc - n);  /* Byt
10680 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d  es of unused mem
10690 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
106a0 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20   x.nFree>=0 );. 
106b0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
106c0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78  YTE_ALIGNMENT(&x
106d0 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d  .pSpace[x.nFree]
106e0 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ) );..  resolveP
106f0 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
10700 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
10710 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
10720 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
10730 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
10740 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
10750 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10760 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
10770 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
10780 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
10790 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
107a0 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
107b0 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
107c0 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
107d0 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74  ated in one or t
107e0 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
107f0 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
10800 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
10810 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72  use unused memor
10820 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  y at the .  ** e
10830 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
10840 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
10850 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
10860 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
10870 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
10880 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
10890 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
108a0 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
108b0 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
108c0 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
108d0 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61  emainder using a
108e0 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c   fresh memory al
108f0 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
10900 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
10910 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
10920 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
10930 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
10940 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
10950 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72  e leftover memor
10960 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
10970 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
10980 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e  .  This can sign
10990 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
109a0 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
109b0 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
109c0 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
109d0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
109e0 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  x.nNeeded = 0;. 
109f0 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
10a00 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 4d 65  Space(&x, 0, nMe
10a10 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10a20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
10a30 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 56  cSpace(&x, 0, nV
10a40 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  ar*sizeof(Mem));
10a50 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c  .  p->apArg = al
10a60 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10a70 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
10a80 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d  ));.  p->apCsr =
10a90 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10aa0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
10ab0 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10ac0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10ad0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10ae0 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65  TATUS.  p->anExe
10af0 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  c = allocSpace(&
10b00 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  x, 0, p->nOp*siz
10b10 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69  eof(i64));.#endi
10b20 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65  f.  if( x.nNeede
10b30 64 20 29 7b 0a 20 20 20 20 78 2e 70 53 70 61 63  d ){.    x.pSpac
10b40 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73  e = p->pFree = s
10b50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
10b60 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65  wNN(db, x.nNeede
10b70 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20  d);.    x.nFree 
10b80 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 20  = x.nNeeded;.   
10b90 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
10ba0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
10bb0 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
10bc0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
10bd0 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
10be0 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  m));.      p->aV
10bf0 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
10c00 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61  &x, p->aVar, nVa
10c10 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  r*sizeof(Mem));.
10c20 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
10c30 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10c40 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
10c50 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20  izeof(Mem*));.  
10c60 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
10c70 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10c80 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
10c90 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
10ca0 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r*));.#ifdef SQL
10cb0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
10cc0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
10cd0 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
10ce0 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10cf0 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
10d00 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
10d10 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  if.    }.  }..  
10d20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61 72  p->pVList = pPar
10d30 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50  se->pVList;.  pP
10d40 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20  arse->pVList =  
10d50 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
10d60 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
10d70 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  n;.  if( db->mal
10d80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10d90 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20   p->nVar = 0;.  
10da0 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30    p->nCursor = 0
10db0 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
10dc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10dd0 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
10de0 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61  rsor;.    p->nVa
10df0 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
10e00 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
10e10 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c  y(p->aVar, nVar,
10e20 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
10e30 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d      p->nMem = nM
10e40 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  em;.    initMemA
10e50 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  rray(p->aMem, nM
10e60 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65  em, db, MEM_Unde
10e70 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73  fined);.    mems
10e80 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20  et(p->apCsr, 0, 
10e90 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
10ea0 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
10eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10ec0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
10ed0 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  US.    memset(p-
10ee0 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e  >anExec, 0, p->n
10ef0 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
10f00 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
10f10 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
10f20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
10f30 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
10f40 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
10f50 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
10f60 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
10f70 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
10f80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
10f90 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
10fa0 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
10fb0 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
10fc0 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
10fd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
10fe0 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20  t( pCx->pBtx==0 
10ff0 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  || pCx->eCurType
11000 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
11010 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 78  );.  switch( pCx
11020 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20  ->eCurType ){.  
11030 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 53    case CURTYPE_S
11040 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ORTER: {.      s
11050 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
11060 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
11070 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11080 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43      }.    case C
11090 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a  URTYPE_BTREE: {.
110a0 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 69        if( pCx->i
110b0 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
110c0 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70        if( pCx->p
110d0 42 74 78 20 29 20 73 71 6c 69 74 65 33 42 74 72  Btx ) sqlite3Btr
110e0 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
110f0 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  x);.        /* T
11100 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
11110 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
11120 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
11130 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
11140 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
11150 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  l above. */.    
11160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11170 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63   assert( pCx->uc
11180 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
11190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
111a0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
111b0 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  Cx->uc.pCursor);
111c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
111d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
111e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
11200 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 56 54   case CURTYPE_VT
11210 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
11220 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
11230 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63  *pVCur = pCx->uc
11240 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f  .pVCur;.      co
11250 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
11260 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56  le *pModule = pV
11270 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  Cur->pVtab->pMod
11280 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ule;.      asser
11290 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d  t( pVCur->pVtab-
112a0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
112b0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
112c0 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f  Ref--;.      pMo
112d0 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43  dule->xClose(pVC
112e0 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ur);.      break
112f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11300 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
11310 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e  e all cursors in
11320 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
11330 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
11340 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  id closeCursorsI
11350 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b  nFrame(Vdbe *p){
11360 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
11370 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
11380 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
11390 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
113a0 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20       VdbeCursor 
113b0 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
113c0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  ];.      if( pC 
113d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
113e0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
113f0 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20  (p, pC);.       
11400 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
11410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11420 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70    }.}../*.** Cop
11430 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
11440 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
11450 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
11460 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
11470 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
11480 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
11490 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
114a0 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
114b0 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
114c0 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
114d0 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
114e0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
114f0 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
11500 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
11510 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
11520 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f  >v;.  closeCurso
11530 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69  rsInFrame(v);.#i
11540 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11550 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
11560 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d  US.  v->anExec =
11570 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b   pFrame->anExec;
11580 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70  .#endif.  v->aOp
11590 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
115a0 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
115b0 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
115c0 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
115d0 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
115e0 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
115f0 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
11600 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
11610 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
11620 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
11630 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
11640 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
11650 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
11660 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
11670 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65    v->db->nChange
11680 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68   = pFrame->nDbCh
11690 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  ange;.  sqlite3V
116a0 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
116b0 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78  (v->db, &v->pAux
116c0 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
116d0 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46  v->pAuxData = pF
116e0 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  rame->pAuxData;.
116f0 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61    pFrame->pAuxDa
11700 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ta = 0;.  return
11710 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
11720 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
11730 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
11740 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
11750 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
11760 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
11770 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
11780 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
11790 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
117a0 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
117b0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
117c0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
117d0 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
117e0 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
117f0 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
11800 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
11810 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
11820 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
11830 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
11840 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
11850 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
11860 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
11870 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
11880 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
11890 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
118a0 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
118b0 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
118c0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
118d0 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
118e0 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20  ;.    p->pFrame 
118f0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61  = 0;.    p->nFra
11900 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  me = 0;.  }.  as
11910 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d  sert( p->nFrame=
11920 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72  =0 );.  closeCur
11930 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a  sorsInFrame(p);.
11940 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
11950 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
11960 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
11970 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
11980 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
11990 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
119a0 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
119b0 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
119c0 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
119d0 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
119e0 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
119f0 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
11a00 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
11a10 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
11a20 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
11a30 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e VM */.  if( p-
11a40 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69  >pAuxData ) sqli
11a50 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
11a60 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e  Data(p->db, &p->
11a70 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
11a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
11a90 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
11aa0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
11ab0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
11ac0 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
11ad0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
11ae0 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
11af0 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
11b00 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
11b10 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
11b20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
11b30 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
11b40 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
11b50 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
11b60 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
11b70 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
11b80 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
11b90 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
11ba0 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
11bb0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
11bc0 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
11bd0 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
11be0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
11bf0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11c00 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f  .  if( p->nResCo
11c10 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65  lumn ){.    rele
11c20 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
11c30 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
11c40 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
11c50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
11c60 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
11c70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d  Name);.  }.  n =
11c80 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
11c90 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
11ca0 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
11cb0 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
11cc0 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
11cd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
11ce0 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
11cf0 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
11d00 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
11d10 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d   return;.  initM
11d20 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
11d30 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f  ame, n, db, MEM_
11d40 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Null);.}../*.** 
11d50 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
11d60 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
11d70 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
11d80 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
11d90 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
11da0 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
11db0 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
11dc0 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
11dd0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
11de0 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
11df0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
11e00 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
11e10 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
11e20 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
11e30 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
11e40 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
11e50 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
11e60 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
11e70 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
11e80 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
11e90 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
11ea0 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
11eb0 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
11ec0 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
11ed0 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
11ee0 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
11ef0 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
11f00 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
11f10 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
11f40 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
11f50 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11f80 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
11f90 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
11fa0 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
11fd0 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
11fe0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
11ff0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
12000 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12010 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
12020 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
12030 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
12040 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
12050 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
12060 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
12070 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
12080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
12090 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
120a0 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
120b0 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
120c0 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
120d0 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
120e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
120f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12100 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
12110 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
12120 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12130 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
12140 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
12150 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
12160 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
12170 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
12180 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
12190 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
121a0 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
121b0 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
121c0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
121d0 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
121e0 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
121f0 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
12200 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
12210 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
12220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
12230 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
12240 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
12250 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
12260 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
12270 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
12280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12290 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
122a0 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
122b0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
122c0 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
122d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
122e0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
122f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
12300 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
12310 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
12320 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
12330 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
12340 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
12350 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
12360 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
12370 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
12380 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
12390 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
123a0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
123c0 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69 64   that are candid
123d0 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d 70  ates for a two-p
123e0 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e  hase commit usin
123f0 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  g a.            
12400 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72         ** master
12410 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  -journal */.  in
12420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12430 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
12440 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
12450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12460 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
12470 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
12480 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
12490 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
124a0 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
124b0 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
124c0 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
124d0 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
124e0 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
124f0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
12500 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
12510 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
12520 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
12530 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
12540 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
12550 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
12560 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
12570 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
12580 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
12590 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
125a0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
125b0 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
125c0 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
125d0 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
125e0 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
125f0 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
12600 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
12610 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
12620 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
12630 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
12640 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
12650 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
12660 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
12670 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
12680 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
12690 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
126a0 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
126b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
126c0 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
126d0 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
126e0 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
126f0 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
12700 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
12710 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
12720 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
12730 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
12740 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
12750 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
12760 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
12770 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
12780 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
12790 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
127a0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
127b0 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
127c0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
127d0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
127e0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
127f0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
12800 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f      /* Whether o
12810 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  r not a database
12820 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d 61   might need a ma
12830 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70  ster journal dep
12840 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20 20  ends upon.      
12850 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d  ** its journal m
12860 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72  ode (among other
12870 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73 20   things).  This 
12880 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e 65  matrix determine
12890 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
128a0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75   journal modes u
128b0 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  se a master jour
128c0 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64 6f  nal and which do
128d0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73 74   not */.      st
128e0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 4d  atic const u8 aM
128f0 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20  JNeeded[] = {.  
12900 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45 20        /* DELETE 
12910 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20 20    */  1,.       
12920 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a 2f   /* PERSIST   */
12930 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   1,.        /* O
12940 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  FF       */ 0,. 
12950 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43 41         /* TRUNCA
12960 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  TE  */ 1,.      
12970 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a    /* MEMORY    *
12980 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
12990 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a 20  WAL       */ 0. 
129a0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50 61       };.      Pa
129b0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 2f  ger *pPager;   /
129c0 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74  * Pager associat
129d0 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20  ed with pBt */. 
129e0 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
129f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
12a00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
12a10 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
12a20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
12a30 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
12a40 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
12a50 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41  safety_level!=PA
12a60 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
12a70 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61 4d  OFF.       && aM
12a80 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33 50  JNeeded[sqlite3P
12a90 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
12aa0 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20 20  de(pPager)].    
12ab0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
12ac0 65 72 49 73 4d 65 6d 64 62 28 70 50 61 67 65 72  erIsMemdb(pPager
12ad0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 20 0a 20  )==0.      ){ . 
12ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
12af0 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  !=1 );.        n
12b00 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d  Trans++;.      }
12b10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12b20 74 65 33 42 74 72 65 65 45 78 63 6c 75 73 69 76  te3BtreeExclusiv
12b30 65 4c 6f 63 6b 28 70 42 74 29 3b 0a 20 20 20 20  eLock(pBt);.    
12b40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12b50 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
12b60 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
12b70 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
12b80 45 4e 54 0a 20 20 69 66 28 20 64 62 2d 3e 62 43  ENT.  if( db->bC
12b90 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 28 72 63  oncurrent && (rc
12ba0 20 26 20 30 78 46 46 29 3d 3d 53 51 4c 49 54 45   & 0xFF)==SQLITE
12bb0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 2f 2a 20  _BUSY ){.    /* 
12bc0 41 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  An SQLITE_BUSY o
12bd0 72 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  r SQLITE_BUSY_SN
12be0 41 50 53 48 4f 54 20 77 61 73 20 65 6e 63 6f 75  APSHOT was encou
12bf0 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 20 20  ntered while .  
12c00 20 20 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20    ** attempting 
12c10 74 6f 20 74 61 6b 65 20 74 68 65 20 57 52 49 54  to take the WRIT
12c20 45 52 20 6c 6f 63 6b 20 6f 6e 20 61 20 77 61 6c  ER lock on a wal
12c30 20 66 69 6c 65 2e 20 52 65 6c 65 61 73 65 20 74   file. Release t
12c40 68 65 0a 20 20 20 20 2a 2a 20 57 52 49 54 45 52  he.    ** WRITER
12c50 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 77 61   locks on all wa
12c60 6c 20 66 69 6c 65 73 20 61 6e 64 20 72 65 74 75  l files and retu
12c70 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20  rn early.  */.  
12c80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
12c90 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
12ca0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12cb0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12cc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12cd0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
12ce0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Bt) ){.        s
12cf0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12d00 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 73  (pBt);.        s
12d10 71 6c 69 74 65 33 50 61 67 65 72 44 72 6f 70 45  qlite3PagerDropE
12d20 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c  xclusiveLock(sql
12d30 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
12d40 42 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Bt));.        sq
12d50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12d60 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
12d70 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
12d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
12da0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
12db0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
12dc0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12dd0 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
12de0 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
12df0 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
12e00 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
12e10 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
12e20 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
12e30 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
12e40 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
12e50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12e60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12e70 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
12e80 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
12e90 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
12ea0 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
12eb0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
12ec0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
12ed0 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
12ee0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
12ef0 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
12f00 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
12f10 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
12f20 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
12f30 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
12f40 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
12f50 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
12f60 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
12f70 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
12f80 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
12f90 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
12fa0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
12fb0 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
12fc0 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
12fd0 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
12fe0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
12ff0 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
13000 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
13010 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
13020 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
13030 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
13040 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13050 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
13060 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
13070 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
13080 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
13090 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
130a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
130b0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
130c0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
130d0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
130e0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
130f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13100 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13110 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
13120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13130 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
13140 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
13150 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
13160 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
13170 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
13180 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
13190 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
131a0 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
131b0 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
131c0 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
131d0 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
131e0 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
131f0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
13200 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
13210 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
13220 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
13230 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
13240 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
13250 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
13260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13270 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
13280 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
13290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
132a0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
132b0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
132c0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
132d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
132e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
132f0 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
13300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13310 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13320 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13330 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
13340 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13350 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
13360 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
13370 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
13380 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
13390 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
133a0 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
133b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
133c0 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
133d0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
133e0 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
133f0 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
13400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
13410 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
13420 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
13430 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
13440 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
13450 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
13460 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
13470 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
13480 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
13490 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
134a0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
134b0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
134c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
134d0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
134e0 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
134f0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
13500 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
13510 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
13520 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
13530 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
13540 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13550 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
13560 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
13570 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
13580 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
13590 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
135a0 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
135b0 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
135c0 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
135d0 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
135e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
135f0 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a  _BKPT;.    do {.
13600 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
13610 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
13620 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
13630 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
13640 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
13650 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
13660 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
13670 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
13680 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
13690 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
136a0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
136b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
136c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
136d0 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
136e0 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
136f0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
13700 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
13710 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
13720 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
13730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
13740 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
13750 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
13760 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
13770 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
13780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13790 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
137a0 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
137b0 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
137c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
137f0 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
13800 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
13810 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
13820 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
13830 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13840 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
13850 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
13860 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
13870 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
13880 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
13890 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
138a0 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
138b0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
138c0 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
138d0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
138e0 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
138f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13910 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
13920 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
13930 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
13940 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
13950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13960 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
13970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13980 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
13990 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
139a0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
139b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
139c0 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
139d0 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
139e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
139f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
13a00 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13a10 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
13a20 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
13a30 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
13a40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
13a50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
13a60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13a80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13a90 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13aa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13ab0 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
13ac0 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
13ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13ae0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
13af0 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
13b00 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
13b10 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
13b20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
13b30 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
13b40 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
13b50 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
13b60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
13b70 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
13b80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
13b90 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
13ba0 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
13bb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13bc0 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
13bd0 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
13be0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
13bf0 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
13c00 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
13c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c20 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13c30 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
13c40 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
13c50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13c60 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
13c70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
13c80 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
13c90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
13ca0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
13cb0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
13cc0 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
13cd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
13ce0 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
13cf0 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
13d00 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
13d10 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
13d20 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
13d30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13d40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
13d50 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
13d60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13d70 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
13d80 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
13d90 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
13da0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
13db0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13dd0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13de0 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
13df0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13e00 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
13e10 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
13e20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13e30 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13e40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
13e50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13e60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13e70 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
13e80 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13e90 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
13ea0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
13eb0 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
13ec0 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
13ed0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
13ee0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30      */.    if( 0
13ef0 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
13f00 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
13f10 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
13f20 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
13f30 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
13f40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
13f50 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
13f60 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
13f70 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
13f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
13f90 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
13fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13fb0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
13fc0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
13fd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13fe0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
13ff0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14000 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
14010 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
14020 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
14030 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
14040 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
14050 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
14060 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
14070 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
14080 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
14090 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
140a0 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
140b0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
140c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
140d0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
140e0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
140f0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
14100 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
14110 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
14120 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14130 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
14140 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
14150 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
14160 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
14170 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
14180 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
14190 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
141a0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
141b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
141c0 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
141d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
141e0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
141f0 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
14200 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
14210 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
14220 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
14230 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
14240 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
14250 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
14260 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
14270 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
14280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
14290 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
142a0 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
142b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
142c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
142d0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
142e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
142f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
14300 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
14320 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14330 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
14340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14350 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
14360 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14370 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
14380 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
14390 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
143a0 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
143b0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
143c0 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
143d0 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
143e0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
143f0 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
14400 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
14410 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14420 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
14430 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
14440 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14450 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
14460 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
14470 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14490 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
144a0 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
144b0 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
144c0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
144d0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
144e0 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
144f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14500 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
14510 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
14520 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
14530 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
14540 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
14550 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
14560 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
14570 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
14580 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
14590 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
145a0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
145b0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
145c0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
145d0 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
145e0 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
145f0 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
14600 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
14610 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
14620 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
14630 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
14640 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
14650 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
14660 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
14670 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14680 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
146a0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
146b0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
146c0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
146d0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
146e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
146f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
14700 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
14710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
14720 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14730 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
14740 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
14750 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
14760 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
14770 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
14780 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
14790 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
147a0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
147b0 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
147c0 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
147d0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
147e0 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
147f0 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
14800 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
14810 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
14820 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
14830 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
14840 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
14850 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
14860 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
14870 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
14880 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
14890 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
148a0 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
148b0 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
148c0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
148d0 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
148e0 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
148f0 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
14900 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
14910 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
14920 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
14930 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
14940 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
14950 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
14960 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
14970 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
14980 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
14990 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
149a0 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
149b0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
149c0 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
149d0 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
149e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
149f0 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
14a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
14a10 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
14a20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
14a30 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
14a40 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
14a50 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
14a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
14a70 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
14a80 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
14a90 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
14aa0 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
14ab0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
14ac0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
14ad0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
14ae0 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
14af0 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
14b00 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
14b10 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
14b20 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
14b30 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14b40 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
14b50 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
14b60 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
14b70 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
14b80 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
14b90 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
14ba0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
14bb0 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
14bc0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
14bd0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
14be0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
14bf0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
14c00 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
14c10 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
14c20 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
14c30 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14c40 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
14c50 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
14c60 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
14c70 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f  LINE int vdbeClo
14c80 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
14c90 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
14ca0 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
14cb0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
14cc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14cd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
14ce0 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
14cf0 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
14d00 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t-1;..  assert( 
14d10 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
14d20 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
14d30 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14d40 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  E);.  assert( db
14d50 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
14d60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
14d70 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
14d80 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
14d90 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
14da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14db0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
14dc0 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
14dd0 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  _OK;.    Btree *
14de0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
14df0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
14e00 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t ){.      if( e
14e10 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
14e20 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
14e30 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
14e40 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
14e50 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
14e60 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
14e70 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14e80 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
14e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14ea0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
14eb0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
14ec0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
14ed0 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
14ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14ef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14f00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14f10 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
14f20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53    }.  }.  db->nS
14f30 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d  tatement--;.  p-
14f40 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
14f50 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14f70 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
14f80 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14f90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
14fa0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
14fb0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14fc0 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
14fd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
14fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14ff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15000 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
15010 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
15020 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
15030 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
15040 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
15050 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15060 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
15070 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
15080 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ore the .  ** da
15090 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
150a0 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
150b0 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
150c0 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
150d0 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74  hen .  ** the st
150e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
150f0 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
15100 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53   */.  if( eOp==S
15110 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15120 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  K ){.    db->nDe
15130 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
15140 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
15150 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
15160 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
15170 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d  tDefImmCons;.  }
15180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15190 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
151a0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
151b0 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
151c0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53  .  if( p->db->nS
151d0 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
151e0 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
151f0 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73   return vdbeClos
15200 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f  eStatement(p, eO
15210 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
15220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
15230 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15240 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
15250 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
15260 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
15270 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
15280 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
15290 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
152a0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
152b0 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
152c0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
152d0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
152e0 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
152f0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
15300 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
15310 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
15320 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
15330 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
15340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
15350 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
15360 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
15370 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
15380 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
15390 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
153a0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
153b0 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
153c0 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
153d0 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  EY.** and write 
153e0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
153f0 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
15400 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15410 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
15420 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
15430 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
15440 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
15450 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
15460 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
15470 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
15480 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64   (deferred && (d
15490 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
154a0 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  +db->nDeferredIm
154b0 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c  mCons)>0) .   ||
154c0 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
154d0 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
154e0 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  0) .  ){.    p->
154f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
15500 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
15510 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  Y;.    p->errorA
15520 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
15530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15540 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49  eError(p, "FOREI
15550 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
15560 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
15570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15580 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
15590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
155a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
155b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
155c0 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
155d0 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
155e0 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
155f0 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
15600 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
15610 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
15620 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
15630 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
15640 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
15650 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
15660 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
15670 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15680 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
15690 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
156a0 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
156b0 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
156c0 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
156d0 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
156e0 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
156f0 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
15700 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
15710 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
15720 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
15730 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
15740 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
15750 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
15760 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
15770 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
15780 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
15790 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
157a0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
157b0 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
157c0 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
157d0 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
157e0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
157f0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
15800 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
15810 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
15840 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
15850 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
15860 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
15870 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
15880 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
15890 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
158a0 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
158b0 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
158c0 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
158d0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
158e0 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
158f0 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
15900 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
15910 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
15920 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
15930 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
15940 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
15950 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
15960 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
15970 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
15980 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
15990 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
159a0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
159b0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
159c0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
159d0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
159e0 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
159f0 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
15a00 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
15a10 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
15a20 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
15a30 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
15a40 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
15a50 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
15a60 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
15a70 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
15a80 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
15a90 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
15aa0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d    */..  if( p->m
15ab0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
15ac0 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
15ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15ae0 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
15af0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
15b00 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
15b10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
15b20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
15b30 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  (p);.  checkActi
15b40 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
15b50 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
15b60 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
15b70 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
15b80 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
15b90 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
15ba0 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
15bb0 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
15bc0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
15bd0 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
15be0 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
15bf0 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
15c00 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
15c10 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
15c20 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
15c30 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
15c40 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
15c50 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
15c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
15c70 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
15c80 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
15c90 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
15ca0 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
15cb0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
15cc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
15cd0 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
15ce0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
15cf0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
15d00 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
15d10 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
15d20 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
15d30 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
15d40 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
15d50 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
15d80 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
15d90 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
15da0 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
15db0 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
15dc0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
15dd0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
15de0 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
15df0 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
15e00 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
15e10 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
15e20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
15e30 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
15e40 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
15e50 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15e60 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
15e70 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
15e80 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
15e90 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
15ea0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
15eb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15ec0 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
15ed0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
15ee0 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
15ef0 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
15f00 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
15f10 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
15f20 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
15f30 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
15f40 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
15f50 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
15f60 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
15f70 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
15f80 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
15f90 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
15fa0 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
15fb0 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
15fc0 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
15fd0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
15fe0 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
15ff0 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
16000 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
16010 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
16020 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
16030 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
16040 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
16050 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
16060 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
16070 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
16090 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
160a0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
160b0 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
160c0 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
160d0 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
160e0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
160f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
16100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16110 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
16120 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
16130 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
16140 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
16150 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
16160 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
16170 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
16180 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
16190 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
161a0 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
161b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
161c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
161d0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
161e0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
161f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
16200 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
16210 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
16220 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
16230 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
16240 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b  bConcurrent = 0;
16250 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
16260 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16270 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16280 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
16290 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
162a0 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
162b0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
162c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
162d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
162e0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
162f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
16300 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
16310 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
16320 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
16330 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
16340 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
16350 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
16360 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
16370 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
16380 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
16390 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
163a0 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
163b0 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
163c0 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
163d0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
163e0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
163f0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
16400 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
16410 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
16420 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
16430 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
16440 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
16450 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
16460 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
16470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
16480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
16490 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
164a0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
164b0 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
164c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
164d0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
164e0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
164f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16500 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
16510 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
16520 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
16530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16540 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
16550 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16560 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
16590 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
165a0 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
165b0 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
165c0 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
165d0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
165e0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
165f0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
16600 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
16610 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
16620 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
16630 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
16640 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
16650 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
16660 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
16670 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
16680 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
16690 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
166a0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
166b0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
166c0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
166d0 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
166e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
166f0 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d 53 51   (rc & 0xFF)==SQ
16700 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
16710 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
16720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16730 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
16740 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
16760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
16780 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
16790 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
167a0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
167b0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
167c0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
167d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
167e0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
167f0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
16800 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
16810 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
16820 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
16830 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34  ->flags &= ~(u64
16840 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  )SQLITE_DeferFKs
16850 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16860 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
16870 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
16880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
168a0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
168b0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
168c0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
168d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
168e0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
168f0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
16900 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
16910 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
16920 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16930 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
16940 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
16950 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
16960 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
16970 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
16980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
16990 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
169a0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
169b0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
169c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
169d0 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
169e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
169f0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16a00 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16a10 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16a20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
16a30 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
16a40 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16a50 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16a60 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
16a70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
16a80 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
16a90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
16aa0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
16ab0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
16ac0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
16ad0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
16ae0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
16af0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
16b00 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
16b10 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
16b20 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
16b30 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
16b40 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
16b50 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
16b60 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
16b70 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
16b80 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
16b90 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
16ba0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
16bb0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
16bc0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
16bd0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
16be0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
16bf0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
16c00 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
16c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
16c20 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
16c30 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
16c40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
16c50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
16c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
16c70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
16c80 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
16c90 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
16ca0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
16cb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16cc0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
16cd0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
16ce0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
16cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
16d00 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
16d10 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
16d20 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
16d30 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
16d40 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
16d50 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
16d60 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
16d70 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65     db->bConcurre
16d80 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nt = 0;.        
16d90 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
16da0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16db0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16dc0 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
16dd0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
16de0 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
16df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
16e00 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
16e10 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
16e30 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
16e40 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
16e50 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
16e60 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
16e70 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
16e80 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
16e90 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
16ea0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
16eb0 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
16ec0 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
16ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
16ee0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
16ef0 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
16f00 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
16f10 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
16f20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
16f30 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
16f40 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
16f50 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
16f60 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
16f70 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
16f80 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
16f90 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
16fa0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
16fb0 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
16fc0 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
16fd0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
16fe0 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
16ff0 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
17000 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
17010 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
17020 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
17030 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
17040 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
17050 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
17060 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
17070 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
17080 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
17090 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
170a0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
170b0 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
170c0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
170d0 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  (db);.  if( db->
170e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
170f0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
17100 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
17110 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
17120 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
17130 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
17140 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
17150 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
17160 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
17170 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
17180 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
17190 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
171a0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
171b0 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
171c0 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
171d0 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
171e0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
171f0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
17200 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
17210 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
17220 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
17230 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
17240 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
17250 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
17260 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
17270 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
17280 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
17290 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
172a0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
172b0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
172c0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
172d0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
172e0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
172f0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
17300 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
17310 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
17320 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
17330 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
17340 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
17350 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
17360 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
17370 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17380 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
17390 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
173a0 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
173b0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
173c0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
173d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
173e0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
173f0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
17400 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
17410 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
17420 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
17430 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
17440 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
17450 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17460 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
17470 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
17480 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
17490 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
174a0 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
174b0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
174c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
174d0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
174e0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
174f0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
17500 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
17510 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
17520 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  {.    db->bBenig
17530 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73  nMalloc++;.    s
17540 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
17550 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
17560 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
17570 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
17580 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
17590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
175a0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
175b0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
175c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
175d0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
175e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
175f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
17600 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
17610 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65  alloc--;.  }else
17620 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b   if( db->pErr ){
17630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
17640 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72  eSetNull(db->pEr
17650 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72  r);.  }.  db->er
17660 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65  rCode = rc;.  re
17670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
17680 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17690 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
176a0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
176b0 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
176c0 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
176d0 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
176e0 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
176f0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
17700 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
17710 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
17720 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
17730 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
17740 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
17750 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
17760 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
17770 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
17780 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
17790 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
177a0 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
177b0 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
177c0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
177d0 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
177e0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
177f0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
17800 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17810 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
17820 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
17830 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
17840 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
17850 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
17860 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
17870 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
17880 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
17890 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
178a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
178b0 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
178c0 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
178d0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
178e0 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
178f0 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
17900 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
17910 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
17920 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
17930 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
17940 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
17950 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
17960 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
17970 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
17980 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
17990 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
179a0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
179b0 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
179c0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
179d0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
179e0 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
179f0 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
17a00 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
17a10 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
17a20 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
17a30 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
17a40 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
17a50 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
17a60 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
17a70 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
17a80 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  i;.#endif..  sql
17a90 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
17aa0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
17ab0 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
17ac0 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
17ad0 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
17ae0 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
17af0 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
17b00 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
17b10 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
17b20 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
17b30 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
17b40 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
17b50 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
17b60 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20 72   VDBE has been r
17b70 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
17b80 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
17b90 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
17ba0 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
17bb0 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
17bc0 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
17bd0 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
17be0 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
17bf0 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
17c00 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
17c10 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
17c20 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
17c30 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
17c40 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
17c50 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
17c60 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
17c70 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
17c80 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
17c90 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
17ca0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
17cb0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
17cc0 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
17cd0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
17ce0 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
17cf0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
17d00 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
17d10 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
17d20 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
17d30 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
17d40 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
17d50 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
17d60 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
17d70 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
17d80 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
17d90 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
17da0 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
17db0 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
17dc0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
17dd0 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
17de0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
17df0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
17e00 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  sg(db, p->rc, p-
17e10 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
17e20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
17e30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  ;.  }..  /* Rese
17e40 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65  t register conte
17e50 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20  nts and reclaim 
17e60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65  error message me
17e70 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  mory..  */.#ifde
17e80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
17e90 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
17ea0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
17eb0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
17ec0 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
17ed0 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
17ee0 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
17ef0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
17f00 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
17f10 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
17f20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
17f30 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
17f40 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
17f50 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
17f60 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
17f70 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
17f80 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
17f90 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
17fa0 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
17fb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
17fc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
17fd0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
17fe0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
17ff0 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
18000 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18010 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74  DEBUG.  p->nWrit
18020 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
18030 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
18040 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
18050 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
18060 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
18070 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
18080 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
18090 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
180a0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
180b0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
180c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
180d0 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
180e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
180f0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
18100 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
18110 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
18120 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
18130 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
18140 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
18150 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
18160 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
18170 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
18180 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18190 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
181a0 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
181b0 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
181c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
181d0 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
181e0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
181f0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
18200 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
18210 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
18220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18230 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
18240 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
18250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
18260 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
18270 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
18280 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
18290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
182a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
182b0 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
182c0 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
182d0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
182e0 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
182f0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
18300 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
18310 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
18320 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
18330 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
18340 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
18350 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
18360 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
18370 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
18380 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
18390 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
183a0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
183b0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
183c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
183d0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
183e0 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a  BE_MAGIC_RESET;.
183f0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
18400 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
18410 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
18420 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
18430 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
18440 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
18450 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
18460 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
18470 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
18480 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
18490 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
184a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
184b0 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
184c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
184d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
184e0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
184f0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
18500 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18510 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
18520 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
18530 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
18540 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
18550 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
18560 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18570 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
18580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18590 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
185a0 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
185b0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
185c0 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
185d0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
185e0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
185f0 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
18600 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
18610 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
18620 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18630 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
18640 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
18650 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
18660 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
18670 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
18680 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
18690 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
186a0 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
186b0 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
186c0 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
186d0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
186e0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
186f0 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
18700 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
18710 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
18720 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
18730 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
18740 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
18750 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
18760 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
18770 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
18780 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
18790 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
187a0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
187b0 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
187c0 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
187d0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
187e0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
187f0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
18800 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
18810 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
18820 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
18830 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20  AuxData(sqlite3 
18840 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70  *db, AuxData **p
18850 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  p, int iOp, int 
18860 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20  mask){.  while( 
18870 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61  *pp ){.    AuxDa
18880 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a  ta *pAux = *pp;.
18890 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a      if( (iOp<0).
188a0 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69       || (pAux->i
188b0 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20  AuxOp==iOp.     
188c0 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41       && pAux->iA
188d0 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20  uxArg>=0.       
188e0 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75     && (pAux->iAu
188f0 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73  xArg>31 || !(mas
18900 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41  k & MASKBIT32(pA
18910 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a  ux->iAuxArg)))).
18920 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
18930 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75  tcase( pAux->iAu
18940 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20  xArg==31 );.    
18950 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
18960 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20  eteAux ){.      
18970 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41    pAux->xDeleteA
18980 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  ux(pAux->pAux);.
18990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
189a0 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41  p = pAux->pNextA
189b0 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ux;.      sqlite
189c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78  3DbFree(db, pAux
189d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
189e0 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
189f0 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20  NextAux;.    }. 
18a00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
18a10 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
18a20 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
18a30 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
18a40 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
18a50 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
18a60 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
18a70 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
18a80 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
18a90 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
18aa0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18ab0 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
18ac0 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
18ad0 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
18ae0 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
18af0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
18b00 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
18b10 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
18b20 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
18b30 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
18b40 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
18b50 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
18b60 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
18b70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
18b80 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
18b90 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
18ba0 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ext;.  assert( p
18bb0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
18bc0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
18bd0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
18be0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
18bf0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
18c00 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
18c10 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
18c20 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
18c30 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
18c40 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
18c50 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
18c60 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
18c70 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
18c80 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
18c90 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61  .  }.  if( p->ma
18ca0 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
18cb0 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65  INIT ){.    rele
18cc0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
18cd0 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
18ce0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18cf0 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b  (db, p->pVList);
18d00 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18d10 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
18d20 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65  ;.  }.  vdbeFree
18d30 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
18d40 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
18d50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18d60 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
18d70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18d80 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66  b, p->zSql);.#if
18d90 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18da0 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73 71  E_NORMALIZE.  sq
18db0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18dc0 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20 20  p->zNormSql);.  
18dd0 7b 0a 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74  {.    DblquoteSt
18de0 72 20 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78 74  r *pThis, *pNext
18df0 3b 0a 20 20 20 20 66 6f 72 28 70 54 68 69 73 3d  ;.    for(pThis=
18e00 70 2d 3e 70 44 62 6c 53 74 72 3b 20 70 54 68 69  p->pDblStr; pThi
18e10 73 3b 20 70 54 68 69 73 3d 70 4e 65 78 74 29 7b  s; pThis=pNext){
18e20 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
18e30 54 68 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b 0a  This->pNextStr;.
18e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
18e50 72 65 65 28 64 62 2c 20 70 54 68 69 73 29 3b 0a  ree(db, pThis);.
18e60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18e70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18e80 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
18e90 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e  TATUS.  {.    in
18ea0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
18eb0 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
18ec0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
18ed0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18ee0 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
18ef0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18f00 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18f10 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Scan);.  }.#endi
18f20 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
18f30 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
18f40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18f50 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
18f60 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
18f70 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *db;..  assert( 
18f80 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
18f90 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
18fa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18fb0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
18fc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
18fd0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
18fe0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
18ff0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
19000 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
19010 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
19020 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
19030 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
19040 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
19050 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
19060 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
19070 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
19080 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
19090 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
190a0 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
190b0 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
190c0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
190d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
190e0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
190f0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
19100 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
19110 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
19120 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
19130 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
19140 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
19150 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
19160 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
19170 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
19180 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
19190 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
191a0 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
191b0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
191c0 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
191d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
191e0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
191f0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
19200 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
19210 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
19220 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
19230 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
19240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
19250 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19260 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
19270 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
19280 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
19290 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
192a0 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
192b0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
192c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
192d0 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
192e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
192f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
19300 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
19310 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
19320 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
19330 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
19340 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
19350 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
19360 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
19370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19380 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
19390 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
193a0 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
193b0 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
193c0 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
193d0 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
193e0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
193f0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
19400 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
19410 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
19420 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
19430 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
19440 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
19450 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
19460 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
19470 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
19480 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
19490 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
194a0 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
194b0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
194c0 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
194d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
194e0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
194f0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
19500 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
19510 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
19520 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
19530 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
19540 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
19550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
19560 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
19570 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19580 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
19590 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
195a0 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
195b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
195c0 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
195d0 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
195e0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
195f0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
19600 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
19610 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
19620 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
19630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19640 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
19650 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
19660 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
19670 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
19680 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
19690 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
196a0 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
196b0 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
196c0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
196d0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
196e0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
196f0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
19700 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19710 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
19720 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
19730 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
19740 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
19750 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
19760 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
19770 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
19780 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19790 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
197a0 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
197b0 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
197c0 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
197d0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
197e0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
197f0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
19800 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
19810 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
19820 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
19830 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
19840 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
19850 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
19860 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
19870 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
19880 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
19890 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
198a0 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
198b0 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
198c0 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
198d0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
198e0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
198f0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
19900 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
19910 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
19920 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
19930 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
19940 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
19950 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
19960 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
19970 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
19980 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
19990 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
199a0 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
199b0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
199c0 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
199d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
199e0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
199f0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
19a00 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
19a10 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
19a20 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
19a30 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74   = *pp;.  assert
19a40 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
19a50 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20  URTYPE_BTREE || 
19a60 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19a70 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20  TYPE_PSEUDO );. 
19a80 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
19a90 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
19aa0 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20  t iMap;.    if( 
19ab0 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
19ac0 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
19ad0 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
19ae0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
19af0 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  pAltCursor;.    
19b00 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20    *piCol = iMap 
19b10 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  - 1;.      retur
19b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19b30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61   }.    return ha
19b40 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
19b50 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  to(p);.  }.  if(
19b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
19b70 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
19b80 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
19b90 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
19ba0 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
19bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19bc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19bd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
19be0 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
19bf0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19c00 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
19c10 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
19c20 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
19c30 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
19c40 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
19c50 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
19c60 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19c70 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
19c80 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
19c90 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
19ca0 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
19cb0 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
19cc0 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
19cd0 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
19ce0 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
19cf0 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
19d00 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
19d10 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
19d20 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
19d30 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
19d40 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
19d50 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
19d60 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
19d70 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
19d80 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
19d90 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
19da0 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
19db0 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
19dc0 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
19dd0 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
19de0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
19df0 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
19e00 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
19e10 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19e20 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
19e30 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
19e40 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
19e50 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
19e60 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
19e70 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
19e80 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
19e90 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
19ea0 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
19eb0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19ec0 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
19ed0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
19ee0 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
19ef0 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
19f00 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
19f10 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
19f20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
19f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
19f40 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
19f50 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
19f60 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19f90 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
19fc0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19fd0 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
19ff0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
1a000 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
1a010 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
1a020 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
1a030 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
1a040 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
1a070 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
1a080 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
1a090 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
1a0a0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
1a0b0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
1a0e0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
1a0f0 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
1a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
1a110 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
1a120 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
1a150 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
1a160 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
1a190 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
1a1a0 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1a1d0 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
1a1e0 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
1a1f0 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
1a200 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
1a210 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
1a220 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
1a230 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
1a240 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
1a250 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
1a260 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
1a270 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
1a280 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
1a290 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
1a2a0 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
1a2b0 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
1a2c0 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
1a2d0 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
1a2e0 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
1a2f0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
1a300 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
1a310 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1a320 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
1a330 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
1a340 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
1a350 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
1a360 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
1a370 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
1a380 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
1a390 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1a3a0 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
1a3b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a3c0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
1a3d0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
1a3e0 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
1a3f0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
1a400 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
1a410 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
1a420 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
1a430 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
1a440 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
1a450 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
1a460 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
1a470 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
1a480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a490 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
1a4a0 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
1a4b0 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d       if( (i&1)==
1a4c0 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
1a4d0 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  >=4 ){.        *
1a4e0 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pLen = 0;.      
1a4f0 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
1a500 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  u;.      }else{.
1a510 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
1a520 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1a530 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1a540 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
1a550 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32  767 ){ *pLen = 2
1a560 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20  ; return 2; }.  
1a570 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
1a580 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72   ){ *pLen = 3; r
1a590 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69  eturn 3; }.    i
1a5a0 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
1a5b0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72   ){ *pLen = 4; r
1a5c0 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69  eturn 4; }.    i
1a5d0 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
1a5e0 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65  ){ *pLen = 6; re
1a5f0 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70  turn 5; }.    *p
1a600 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
1a610 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
1a620 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
1a630 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
1a640 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
1a650 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
1a660 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
1a670 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
1a680 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1a690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
1a6a0 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
1a6b0 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
1a6c0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
1a6d0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
1a6e0 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
1a6f0 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
1a700 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
1a710 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
1a720 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
1a730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  .}../*.** The si
1a740 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74  zes for serial t
1a750 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ypes less than 1
1a760 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  28.*/.static con
1a770 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
1a780 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
1a790 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20  {.        /*  0 
1a7a0 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20    1   2   3   4 
1a7b0 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20    5   6   7   8 
1a7c0 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30    9 */   ./*   0
1a7d0 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c   */   0,  1,  2,
1a7e0 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c    3,  4,  6,  8,
1a7f0 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    8,  0,  0,./* 
1a800 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   10 */   0,  0, 
1a810 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
1a820 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a   2,  2,  3,  3,.
1a830 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20  /*  20 */   4,  
1a840 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20  4,  5,  5,  6,  
1a850 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20  6,  7,  7,  8,  
1a860 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39  8,./*  30 */   9
1a870 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31  ,  9, 10, 10, 11
1a880 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33  , 11, 12, 12, 13
1a890 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20  , 13,./*  40 */ 
1a8a0 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c   14, 14, 15, 15,
1a8b0 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c   16, 16, 17, 17,
1a8c0 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20   18, 18,./*  50 
1a8d0 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20  */  19, 19, 20, 
1a8e0 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20  20, 21, 21, 22, 
1a8f0 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20  22, 23, 23,./*  
1a900 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32  60 */  24, 24, 2
1a910 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32  5, 25, 26, 26, 2
1a920 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f  7, 27, 28, 28,./
1a930 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39  *  70 */  29, 29
1a940 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31  , 30, 30, 31, 31
1a950 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33  , 32, 32, 33, 33
1a960 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c  ,./*  80 */  34,
1a970 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c   34, 35, 35, 36,
1a980 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c   36, 37, 37, 38,
1a990 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20   38,./*  90 */  
1a9a0 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20  39, 39, 40, 40, 
1a9b0 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20  41, 41, 42, 42, 
1a9c0 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a  43, 43,./* 100 *
1a9d0 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34  /  44, 44, 45, 4
1a9e0 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34  5, 46, 46, 47, 4
1a9f0 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31  7, 48, 48,./* 11
1aa00 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30  0 */  49, 49, 50
1aa10 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32  , 50, 51, 51, 52
1aa20 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a  , 52, 53, 53,./*
1aa30 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c   120 */  54, 54,
1aa40 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c   55, 55, 56, 56,
1aa50 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a   57, 57.};../*.*
1aa60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
1aa70 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
1aa80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1aa90 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
1aaa0 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
1aab0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
1aac0 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
1aad0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
1aae0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1aaf0 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72  128 ){.    retur
1ab00 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
1ab10 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
1ab20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
1ab30 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20  l_type<12 .     
1ab40 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1ab50 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
1ab60 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73  serial_type]==(s
1ab70 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1ab80 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  /2 );.    return
1ab90 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1aba0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1abb0 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71  pe];.  }.}.u8 sq
1abc0 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
1abd0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38  SerialTypeLen(u8
1abe0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
1abf0 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
1ac00 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65  type<128 );.  re
1ac10 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
1ac20 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
1ac30 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a  l_type];  .}../*
1ac40 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
1ac50 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
1ac60 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
1ac70 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
1ac80 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
1ac90 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
1aca0 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
1acb0 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
1acc0 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
1acd0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
1ace0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
1acf0 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
1ad00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1ad10 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
1ad20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
1ad30 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
1ad40 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
1ad50 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
1ad60 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
1ad70 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
1ad80 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
1ad90 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
1ada0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
1adb0 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
1adc0 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
1add0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
1ade0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
1adf0 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
1ae00 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
1ae10 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
1ae20 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
1ae30 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1ae40 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
1ae50 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
1ae60 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
1ae70 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
1ae80 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
1ae90 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
1aea0 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
1aeb0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
1aec0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
1aed0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
1aee0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
1aef0 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
1af00 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
1af10 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
1af20 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
1af30 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
1af40 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
1af50 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
1af60 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
1af70 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
1af80 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
1af90 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
1afa0 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
1afb0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
1afc0 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
1afd0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
1afe0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
1aff0 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
1b000 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
1b010 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
1b020 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
1b030 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
1b040 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
1b050 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
1b060 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
1b070 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
1b080 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
1b090 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
1b0a0 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
1b0b0 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
1b0c0 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
1b0d0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
1b0e0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
1b0f0 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
1b100 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
1b110 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
1b120 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
1b130 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
1b140 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
1b150 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
1b160 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
1b170 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
1b180 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
1b190 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
1b1a0 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
1b1b0 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
1b1c0 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
1b1d0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
1b1e0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
1b1f0 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
1b200 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
1b210 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
1b220 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
1b230 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
1b240 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
1b250 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
1b260 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
1b270 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
1b280 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
1b290 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
1b2a0 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
1b2b0 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
1b2c0 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
1b2d0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
1b2e0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
1b2f0 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
1b300 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
1b310 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
1b320 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
1b330 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
1b340 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
1b350 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
1b360 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
1b370 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
1b380 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
1b390 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
1b3a0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
1b3b0 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
1b3c0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1b3d0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1b3e0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
1b3f0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
1b400 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
1b410 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
1b420 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
1b430 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
1b440 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1b450 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1b460 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
1b470 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
1b480 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1b490 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1b4a0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
1b4b0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
1b4c0 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
1b4d0 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
1b4e0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
1b4f0 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
1b500 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
1b510 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
1b520 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
1b530 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
1b540 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
1b550 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
1b560 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
1b570 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1b580 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b590 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
1b5a0 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
1b5b0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1b5c0 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
1b5d0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
1b5e0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
1b5f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
1b600 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
1b610 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
1b620 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
1b630 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1b640 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
1b650 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
1b660 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1b670 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
1b680 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
1b690 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
1b6a0 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
1b6b0 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
1b6c0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
1b6d0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
1b6e0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1b6f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1b700 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
1b710 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
1b720 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
1b730 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
1b740 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
1b750 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
1b760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b770 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
1b780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
1b790 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  = i = sqlite3Sma
1b7a0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1b7b0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73  al_type];.    as
1b7c0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
1b7d0 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
1b7e0 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
1b7f0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
1b800 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
1b810 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
1b820 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
1b830 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
1b840 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b850 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
1b860 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
1b870 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1b880 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
1b890 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
1b8a0 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
1b8b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b8c0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1b8d0 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
1b8e0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69  = pMem->n;.    i
1b8f0 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70  f( len>0 ) memcp
1b900 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
1b910 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
1b920 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
1b930 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
1b940 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
1b950 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
1b960 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
1b970 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
1b980 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
1b990 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
1b9a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b9b0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
1b9c0 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
1b9d0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
1b9e0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
1b9f0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
1ba00 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
1ba10 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
1ba20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
1ba30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
1ba40 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
1ba50 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
1ba60 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
1ba70 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
1ba80 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1ba90 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
1baa0 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
1bab0 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
1bac0 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
1bad0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
1bae0 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
1baf0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
1bb00 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1bb10 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
1bb20 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
1bb30 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
1bb40 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
1bb50 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
1bb60 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
1bb70 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1bb80 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
1bb90 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1bba0 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
1bbb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bbc0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1bbd0 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
1bbe0 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
1bbf0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
1bc00 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
1bc10 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
1bc20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
1bc30 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
1bc40 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
1bc50 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
1bc60 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
1bc70 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
1bc80 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
1bc90 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
1bca0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
1bcb0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1bcc0 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
1bcd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1bce0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1bcf0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1bd00 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1bd10 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd30 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1bd40 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1bd50 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd70 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1bd80 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1bd90 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
1bda0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bdb0 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
1bdc0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1bdd0 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
1bde0 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
1bdf0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
1be00 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
1be10 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32  E-OF: R-29851-52
1be20 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62  272 Value is a b
1be30 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74  ig-endian 64-bit
1be40 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d  .    ** twos-com
1be50 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1be60 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e   */.    pMem->u.
1be70 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
1be80 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1be90 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65   MEM_Int;.    te
1bea0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1beb0 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i<0 );.  }else{.
1bec0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1bed0 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31  OF: R-57343-4911
1bee0 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1bef0 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34  -endian IEEE 754
1bf00 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20  -2008 64-bit.   
1bf10 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
1bf20 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69  nt number. */.#i
1bf30 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1bf40 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
1bf50 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1bf60 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
1bf70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
1bf80 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
1bf90 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1bfa0 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
1bfb0 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
1bfc0 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
1bfd0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1bfe0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
1bff0 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
1c000 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
1c010 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1c020 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
1c030 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
1c040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1c050 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
1c060 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
1c070 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
1c080 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
1c090 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
1c0a0 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
1c0b0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1c0c0 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
1c0d0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
1c0e0 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
1c0f0 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
1c100 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
1c110 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
1c120 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
1c130 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
1c140 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
1c150 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
1c160 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
1c170 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
1c180 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
1c190 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
1c1a0 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
1c1b0 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
1c1c0 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
1c1d0 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
1c1e0 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
1c1f0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
1c200 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1c210 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
1c220 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
1c230 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
1c240 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
1c250 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1c260 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1c270 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
1c280 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
1c2b0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
1c2c0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
1c2d0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1c2e0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
1c2f0 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75   { /* Internal u
1c300 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69  se only: NULL wi
1c310 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
1c320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c330 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61  ** UPDATE no-cha
1c340 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a  nge flag set */.
1c350 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c360 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  s = MEM_Null|MEM
1c370 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65  _Zero;.      pMe
1c380 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
1c390 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pMem->u.nZero = 
1c3a0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1c3b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1c3c0 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
1c3d0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1c3e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
1c3f0 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
1c400 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c410 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
1c420 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
1c430 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1c440 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1c450 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
1c460 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1c470 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1c480 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
1c490 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
1c4a0 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
1c4b0 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
1c4c0 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
1c4d0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1c4e0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
1c4f0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1c500 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c510 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c520 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c530 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1c540 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1c550 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1c560 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c570 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1c580 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
1c590 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
1c5a0 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
1c5b0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1c5c0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1c5d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1c5e0 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
1c5f0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1c600 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1c610 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1c620 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1c630 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1c640 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
1c650 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1c660 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c670 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1c680 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1c690 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
1c6a0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1c6b0 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
1c6c0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1c6d0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1c6e0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1c6f0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1c700 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1c710 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c720 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c730 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c740 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1c750 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1c760 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1c770 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c780 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1c790 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1c7a0 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1c7b0 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1c7c0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1c7d0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1c7e0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1c7f0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1c800 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1c810 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1c820 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1c830 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1c840 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1c850 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1c860 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1c870 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1c880 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1c890 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1c8a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1c8b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1c8c0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1c8d0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1c8e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1c8f0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1c900 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1c910 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c920 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1c930 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1c940 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1c950 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1c960 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1c970 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1c980 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1c990 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1c9a0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1c9b0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1c9c0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1c9d0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1c9e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c9f0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1ca00 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1ca10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1ca20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ca30 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1ca40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1ca50 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1ca60 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1ca70 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1ca80 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1ca90 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1caa0 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1cab0 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1cac0 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1cad0 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1cae0 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1caf0 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1cb00 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1cb10 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1cb20 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1cb30 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1cb40 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1cb50 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1cb60 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1cb70 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1cb80 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1cb90 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1cba0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1cbb0 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1cbc0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1cbd0 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1cbe0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1cbf0 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1cc00 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1cc10 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1cc20 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1cc30 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1cc40 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1cc50 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1cc60 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1cc70 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1cc80 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1cc90 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1cca0 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1ccb0 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1ccc0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1ccd0 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1cce0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1ccf0 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1cd00 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1cd10 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1cd20 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1cd30 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1cd40 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1cd50 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1cd60 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1cd70 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1cd80 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1cd90 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1cda0 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1cdb0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1cdc0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1cdd0 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1cde0 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1cdf0 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1ce00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1ce10 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1ce20 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1ce30 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1ce40 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1ce50 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1ce60 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1ce70 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1ce80 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1ce90 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1cea0 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1ceb0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1cec0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1ced0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1cee0 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1cef0 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1cf00 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1cf10 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1cf20 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1cf30 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1cf40 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1cf50 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1cf60 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1cf70 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1cf80 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1cf90 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1cfa0 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1cfb0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1cfc0 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1cfd0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1cfe0 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1cff0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1d000 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1d010 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1d020 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1d030 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1d040 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1d050 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1d060 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1d070 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1d080 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1d090 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1d0a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1d0b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1d0c0 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1d0d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1d0e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1d0f0 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fo              
1d100 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1d110 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1d120 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1d130 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1d140 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1d150 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1d160 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
1d170 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d180 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d190 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1d1a0 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20  red for *p */.  
1d1b0 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1d1c0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1d1d0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1d1e0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1d1f0 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20  nKeyField+1);.  
1d200 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1d210 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1d220 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1d230 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1d240 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1d250 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   0;.  p->aMem = 
1d260 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1d270 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1d280 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1d290 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1d2a0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1d2b0 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1d2c0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1d2d0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1d2e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1d2f0 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1d300 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1d310 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1d320 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1d330 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1d340 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1d350 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1d360 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1d370 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1d380 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1d390 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1d3a0 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1d3b0 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1d3c0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1d3d0 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1d3e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1d3f0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1d400 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1d410 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1d420 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1d430 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d440 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1d450 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1d460 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1d470 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1d480 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1d490 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1d4a0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1d4b0 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1d4c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1d4d0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1d4e0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1d4f0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1d500 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1d510 20 75 33 32 20 64 3b 20 0a 20 20 75 33 32 20 69   u32 d; .  u32 i
1d520 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1d540 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1d550 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1d560 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1d590 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1d5a0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1d5b0 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1d5c0 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1d5d0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1d5e0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1d5f0 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1d600 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1d610 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1d620 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1d630 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1d640 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1d650 28 75 33 32 29 6e 4b 65 79 20 29 7b 0a 20 20 20  (u32)nKey ){.   
1d660 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1d670 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
1d680 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
1d690 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
1d6a0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
1d6b0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1d6c0 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
1d6d0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1d6e0 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
1d6f0 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
1d700 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1d710 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
1d720 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
1d730 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
1d740 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
1d750 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
1d760 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1d770 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
1d780 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
1d790 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
1d7a0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
1d7b0 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
1d7c0 0a 20 20 69 66 28 20 64 3e 28 75 33 32 29 6e 4b  .  if( d>(u32)nK
1d7d0 65 79 20 26 26 20 75 20 29 7b 0a 20 20 20 20 61  ey && u ){.    a
1d7e0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1d7f0 42 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 61  B );.    /* In a
1d800 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64 20   corrupt record 
1d810 65 6e 74 72 79 2c 20 74 68 65 20 6c 61 73 74 20  entry, the last 
1d820 70 4d 65 6d 20 6d 69 67 68 74 20 68 61 76 65 20  pMem might have 
1d830 62 65 65 6e 20 73 65 74 20 75 70 20 75 73 69 6e  been set up usin
1d840 67 20 0a 20 20 20 20 2a 2a 20 75 6e 69 6e 69 74  g .    ** uninit
1d850 69 61 6c 69 7a 65 64 20 6d 65 6d 6f 72 79 2e 20  ialized memory. 
1d860 4f 76 65 72 77 72 69 74 65 20 69 74 73 20 76 61  Overwrite its va
1d870 6c 75 65 20 77 69 74 68 20 4e 55 4c 4c 2c 20 74  lue with NULL, t
1d880 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 2a 2a  o prevent.    **
1d890 20 77 61 72 6e 69 6e 67 73 20 66 72 6f 6d 20 4d   warnings from M
1d8a0 53 41 4e 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  SAN. */.    sqli
1d8b0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
1d8c0 6c 28 70 4d 65 6d 2d 31 29 3b 0a 20 20 7d 0a 20  l(pMem-1);.  }. 
1d8d0 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
1d8e0 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20  Info->nKeyField 
1d8f0 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
1d900 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65  ld = u;.}..#ifde
1d910 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1d920 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d930 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
1d940 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
1d950 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
1d960 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
1d970 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
1d980 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1d990 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
1d9a0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d9b0 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
1d9c0 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1d9d0 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
1d9e0 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
1d9f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
1da00 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
1da10 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1da20 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
1da30 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
1da40 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1da50 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
1da60 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
1da70 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
1da80 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1da90 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
1daa0 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
1dab0 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
1dac0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1dad0 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ue if the result
1dae0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
1daf0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1db00 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a  desiredResult..*
1db10 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1db20 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73  f there is a dis
1db30 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  agreement..*/.st
1db40 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1db50 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1db60 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1db70 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1db80 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1db90 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1dba0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1dbb0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1dbc0 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73    int desiredRes
1dbd0 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
1dbe0 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65  /* Correct answe
1dbf0 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  r */.){.  u32 d1
1dc00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1dc10 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1dc20 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1dc30 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1dc40 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1dc50 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1dc60 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
1dc70 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
1dc80 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1dc90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dca0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
1dcb0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
1dcc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1dcd0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1dce0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1dcf0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1dd00 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
1dd10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1dd20 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1dd30 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
1dd40 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1dd50 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1dd60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1dd70 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1dd80 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
1dd90 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1dda0 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
1ddb0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
1ddc0 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
1ddd0 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
1dde0 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
1ddf0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1de00 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1de10 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1de20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1de30 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
1de40 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
1de50 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
1de60 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
1de70 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
1de80 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
1de90 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
1dea0 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
1deb0 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
1dec0 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
1ded0 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
1dee0 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
1def0 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
1df00 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
1df10 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
1df20 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
1df30 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
1df40 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
1df50 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
1df60 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
1df70 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
1df80 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
1df90 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
1dfa0 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
1dfb0 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
1dfc0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
1dfd0 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
1dfe0 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
1dff0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1e000 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
1e010 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
1e020 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
1e030 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
1e040 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
1e050 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1e060 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1e070 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39  ;.  if( szHdr1>9
1e080 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51  8307 ) return SQ
1e090 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1e0a0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
1e0b0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1e0c0 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65  >nAllField>=pPKe
1e0d0 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
1e0e0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1e0f0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1e100 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1e110 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1e120 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30  nfo->nKeyField>0
1e130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1e140 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1e150 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1e160 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1e170 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
1e180 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
1e190 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
1e1a0 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
1e1b0 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
1e1c0 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
1e1d0 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
1e1e0 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
1e1f0 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1e200 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
1e210 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
1e220 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
1e230 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
1e240 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
1e250 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
1e260 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
1e270 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
1e280 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
1e290 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e2a0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
1e2b0 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
1e2c0 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
1e2d0 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
1e2e0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
1e2f0 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
1e300 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
1e310 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1e320 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
1e330 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
1e340 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 28 75 36  /.    if( d1+(u6
1e350 34 29 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  4)serial_type1+2
1e360 3e 28 75 36 34 29 6e 4b 65 79 31 0a 20 20 20 20  >(u64)nKey1.    
1e370 20 26 26 20 64 31 2b 28 75 36 34 29 73 71 6c 69   && d1+(u64)sqli
1e380 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1e390 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1e3a0 31 29 3e 28 75 36 34 29 6e 4b 65 79 31 20 0a 20  1)>(u64)nKey1 . 
1e3b0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1e3c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e3d0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1e3e0 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1e3f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1e400 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1e410 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1e420 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1e430 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1e440 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1e450 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1e460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1e470 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1e480 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1e490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79              pKey
1e4b0 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e  Info->nAllField>
1e4c0 69 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i ? pKeyInfo->aC
1e4d0 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
1e4e0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1e4f0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1e500 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1e510 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1e520 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1e530 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1e540 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1e550 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1e560 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1e570 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1e580 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1e590 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1e5a0 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1e5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1e5c0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1e5d0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1e5e0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1e5f0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1e600 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1e610 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1e620 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1e630 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1e640 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1e650 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1e660 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1e670 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1e680 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1e690 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1e6a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1e6b0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1e6c0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1e6d0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1e6e0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1e6f0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1e700 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1e710 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1e720 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1e730 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1e740 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1e750 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1e760 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1e770 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1e780 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1e790 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1e7a0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1e7b0 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1e7c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1e7d0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1e7e0 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1e7f0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1e800 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1e810 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1e820 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1e830 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1e840 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1e850 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e860 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1e870 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1e880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e890 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  BUG./*.** Count 
1e8a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
1e8b0 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c  elds (a.k.a. col
1e8c0 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63  umns) in the rec
1e8d0 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20  ord given by.** 
1e8e0 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20  pKey,nKey.  The 
1e8f0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1e900 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74   count is less t
1e910 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1e920 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76  the.** limit giv
1e930 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e  en by pKeyInfo->
1e940 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  nAllField..**.**
1e950 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1e960 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1e970 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1e980 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1e990 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1e9a0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1e9b0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1e9c0 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1e9d0 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1e9e0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1e9f0 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1ea00 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1ea10 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1ea20 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1ea30 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f 72  nfo.nKeyField or
1ea40 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65   KeyInfo.nAllFie
1ea50 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 63  ld values were c
1ea60 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72  omputed.** incor
1ea70 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
1ea80 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 72  c void vdbeAsser
1ea90 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1eaa0 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e  nLimits(.  int n
1eab0 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Key, const void 
1eac0 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
1ead0 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79  record to verify
1eae0 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79   */ .  const Key
1eaf0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20  Info *pKeyInfo  
1eb00 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20       /* Compare 
1eb10 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b  size with this K
1eb20 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69  eyInfo */.){.  i
1eb30 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20  nt nField = 0;. 
1eb40 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33   u32 szHdr;.  u3
1eb50 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74  2 idx;.  u32 not
1eb60 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Used;.  const un
1eb70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1eb80 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
1eb90 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a  ned char*)pKey;.
1eba0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1ebb0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64  B ) return;.  id
1ebc0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1ebd0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1ebe0 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20  assert( nKey>=0 
1ebf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48  );.  assert( szH
1ec00 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b  dr<=(u32)nKey );
1ec10 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1ec20 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b  Hdr ){.    idx +
1ec30 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1ec40 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29  ey+idx, notUsed)
1ec50 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a  ;.    nField++;.
1ec60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46    }.  assert( nF
1ec70 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f  ield <= pKeyInfo
1ec80 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d  ->nAllField );.}
1ec90 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1eca0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1ecb0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1ecc0 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1ecd0 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1ece0 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1ecf0 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1ed00 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1ed10 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1ed20 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1ed30 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1ed40 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1ed50 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1ed60 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1ed70 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1ed80 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1ed90 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1eda0 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1edb0 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1edc0 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1edd0 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1ede0 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1edf0 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1ee00 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1ee10 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1ee20 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1ee30 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1ee40 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1ee50 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1ee60 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee80 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1ee90 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1eea0 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1eeb0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1eec0 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1eed0 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1eee0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1eef0 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1ef00 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1ef10 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1ef20 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1ef30 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1ef40 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1ef50 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1ef60 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1ef70 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1ef80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1ef90 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1efa0 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1efb0 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1efc0 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1efd0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1efe0 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1eff0 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1f000 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1f010 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1f020 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1f030 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1f040 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1f050 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1f060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1f070 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1f080 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1f090 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1f0a0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1f0b0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1f0c0 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1f0d0 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1f0e0 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1f0f0 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1f100 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1f110 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1f120 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  v2==0) ){.      
1f130 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70 72  if( prcErr ) *pr
1f140 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1f150 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1f160 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
1f170 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43  e{.      rc = pC
1f180 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1f190 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31  >pUser, c1.n, v1
1f1a0 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20  , c2.n, v2);.   
1f1b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1f1c0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
1f1d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f1e0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
1f1f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1f200 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1f210 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69  he input pBlob i
1f220 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1f230 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69  be a Blob that i
1f240 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20  s not marked.** 
1f250 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20  with MEM_Zero.  
1f260 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
1f270 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72  t could be a zer
1f280 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69  o-blob..*/.stati
1f290 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28  c int isAllZero(
1f2a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1f2b0 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt n){.  int i;.
1f2c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
1f2d0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
1f2e0 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
1f2f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1f300 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1f310 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75  two blobs.  Retu
1f320 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1f330 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1f340 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  f the first.** i
1f350 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1f360 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1f370 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1f380 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  d, respectively.
1f390 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20  .** If one blob 
1f3a0 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
1f3b0 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74  he other, then t
1f3c0 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68  he shorter is th
1f3d0 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c  e lessor..*/.SQL
1f3e0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1f3f0 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1f400 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1f410 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1f420 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  B2){.  int c;.  
1f430 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b  int n1 = pB1->n;
1f440 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d  .  int n2 = pB2-
1f450 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  >n;..  /* It is 
1f460 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65  possible to have
1f470 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68   a Blob value th
1f480 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d  at has some non-
1f490 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  zero content.  *
1f4a0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  * followed by ze
1f4b0 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ro content.  But
1f4c0 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73   that only comes
1f4d0 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f   up for Blobs fo
1f4e0 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rmed.  ** by the
1f4f0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1f500 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20  pcode, and such 
1f510 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20  Blobs never get 
1f520 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
1f530 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1f540 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  re(). */.  asser
1f550 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26  t( (pB1->flags &
1f560 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
1f570 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65   n1==0 );.  asse
1f580 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20  rt( (pB2->flags 
1f590 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1f5a0 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  | n2==0 );..  if
1f5b0 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42  ( (pB1->flags|pB
1f5c0 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f  2->flags) & MEM_
1f5d0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20  Zero ){.    if( 
1f5e0 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32  pB1->flags & pB2
1f5f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1f600 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ro ){.      retu
1f610 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1f620 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  - pB2->u.nZero;.
1f630 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42      }else if( pB
1f640 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  1->flags & MEM_Z
1f650 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ero ){.      if(
1f660 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d   !isAllZero(pB2-
1f670 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65  >z, pB2->n) ) re
1f680 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72  turn -1;.      r
1f690 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65  eturn pB1->u.nZe
1f6a0 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c  ro - n2;.    }el
1f6b0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69  se{.      if( !i
1f6c0 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c  sAllZero(pB1->z,
1f6d0 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB1->n) ) retur
1f6e0 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1f6f0 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e  rn n1 - pB2->u.n
1f700 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Zero;.    }.  }.
1f710 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31    c = memcmp(pB1
1f720 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e  ->z, pB2->z, n1>
1f730 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20  n2 ? n2 : n1);. 
1f740 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20   if( c ) return 
1f750 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d  c;.  return n1 -
1f760 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f   n2;.}../*.** Do
1f770 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
1f780 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73  tween a 64-bit s
1f790 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e  igned integer an
1f7a0 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  d a 64-bit float
1f7b0 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing-point.** num
1f7c0 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  ber.  Return neg
1f7d0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1f7e0 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1f7f0 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c  first (i64) is l
1f800 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75  ess than,.** equ
1f810 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1f820 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1f830 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73  d (double)..*/.s
1f840 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1f850 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f860 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72  (i64 i, double r
1f870 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  ){.  if( sizeof(
1f880 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1f890 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f  >8 ){.    LONGDO
1f8a0 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c  UBLE_TYPE x = (L
1f8b0 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69  ONGDOUBLE_TYPE)i
1f8c0 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20  ;.    if( x<r ) 
1f8d0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1f8e0 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20  f( x>r ) return 
1f8f0 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1f900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1f910 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  64 y;.    double
1f920 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39   s;.    if( r<-9
1f930 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1f940 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31  08.0 ) return +1
1f950 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39 32 32  ;.    if( r>=922
1f960 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1f970 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1f980 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1f990 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1f9a0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1f9b0 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20 2b 31   i>y ) return +1
1f9c0 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c  ;.    s = (doubl
1f9d0 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72  e)i;.    if( s<r
1f9e0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1f9f0 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75    if( s>r ) retu
1fa00 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  rn +1;.    retur
1fa10 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
1fa20 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
1fa30 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
1fa40 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
1fa50 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
1fa60 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
1fa70 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
1fa80 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
1fa90 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1faa0 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
1fab0 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
1fac0 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
1fad0 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
1fae0 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
1faf0 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
1fb00 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
1fb10 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
1fb20 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
1fb30 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
1fb40 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
1fb50 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
1fb60 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
1fb70 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
1fb80 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
1fb90 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1fba0 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
1fbb0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1fbc0 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
1fbd0 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1fbe0 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
1fbf0 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
1fc00 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
1fc10 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69   int f1, f2;.  i
1fc20 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  nt combined_flag
1fc30 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31  s;..  f1 = pMem1
1fc40 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20  ->flags;.  f2 = 
1fc50 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem2->flags;.  
1fc60 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d  combined_flags =
1fc70 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74   f1|f2;.  assert
1fc80 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ( !sqlite3VdbeMe
1fc90 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 31 29  mIsRowSet(pMem1)
1fca0 20 26 26 20 21 73 71 6c 69 74 65 33 56 64 62 65   && !sqlite3Vdbe
1fcb0 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d  MemIsRowSet(pMem
1fcc0 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20  2) );. .  /* If 
1fcd0 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  one value is NUL
1fce0 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  L, it is less th
1fcf0 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66  an the other. If
1fd00 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a   both values.  *
1fd10 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75  * are NULL, retu
1fd20 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
1fd30 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1fd40 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1fd50 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e  return (f2&MEM_N
1fd60 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e  ull) - (f1&MEM_N
1fd70 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
1fd80 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  At least one of 
1fd90 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69  the two values i
1fda0 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a  s a number.  */.
1fdb0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1fdc0 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  lags&(MEM_Int|ME
1fdd0 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69  M_Real) ){.    i
1fde0 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1fdf0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1fe00 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1fe10 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
1fe20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1fe30 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1fe40 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
1fe50 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1fe60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1fe70 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1fe80 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  2 & MEM_Real)!=0
1fe90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1fea0 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32  em1->u.r < pMem2
1feb0 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d  ->u.r ) return -
1fec0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1fed0 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d  m1->u.r > pMem2-
1fee0 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.r ) return +1
1fef0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1ff00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ff10 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
1ff20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1ff30 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1ff40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ff50 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1ff60 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e  ompare(pMem1->u.
1ff70 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a  i, pMem2->u.r);.
1ff80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ff90 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1ffa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ffb0 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65    if( (f1&MEM_Re
1ffc0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1ffd0 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
1ffe0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1fff0 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e  eturn -sqlite3In
20000 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
20010 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d  em2->u.i, pMem1-
20020 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
20030 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
20040 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
20050 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
20060 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  +1;.  }..  /* If
20070 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
20080 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f  string and the o
20090 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20  ther is a blob, 
200a0 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65  the string is le
200b0 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
200c0 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f   are strings, co
200d0 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  mpare using the 
200e0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
200f0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
20100 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
20110 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66  EM_Str ){.    if
20120 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f1 & MEM_Str)
20130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
20140 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
20150 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53   if( (f2 & MEM_S
20160 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
20170 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
20180 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ..    assert( pM
20190 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d  em1->enc==pMem2-
201a0 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64  >enc || pMem1->d
201b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
201c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
201d0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
201e0 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
201f0 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
20200 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
20210 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
20220 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
20230 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
20240 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
20250 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
20260 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
20270 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
20280 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
20290 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
202a0 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
202b0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
202c0 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
202d0 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
202e0 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
202f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
20300 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
20310 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
20320 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
20330 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
20340 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
20350 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
20360 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pColl, 0);.    }
20370 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
20380 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
20390 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
203a0 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
203b0 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
203c0 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
203d0 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
203e0 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
203f0 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
20400 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
20410 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
20420 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65  mcmp().  */.  re
20430 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62  turn sqlite3Blob
20440 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70  Compare(pMem1, p
20450 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Mem2);.}.../*.**
20460 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
20470 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
20480 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
20490 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61   serial-type tha
204a0 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  t.** corresponds
204b0 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   to an integer -
204c0 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77   all values betw
204d0 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c  een 1 and 9 incl
204e0 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74  usive .** except
204f0 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70   7. The second p
20500 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
20510 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
20520 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a  integer value.**
20530 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f   serialized acco
20540 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f  rding to serial_
20550 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74  type. This funct
20560 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
20570 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
20580 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  the value..*/.st
20590 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
205a0 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
205b0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
205c0 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
205d0 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74   u32 y;.  assert
205e0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
205f0 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20  (serial_type>=1 
20600 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  && serial_type<=
20610 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  9 && serial_type
20620 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68  !=7) );.  switch
20630 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
20640 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
20650 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74   case 1:.      t
20660 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
20670 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
20680 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49  eturn ONE_BYTE_I
20690 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
206a0 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74  se 2:.      test
206b0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
206c0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
206d0 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  rn TWO_BYTE_INT(
206e0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
206f0 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  3:.      testcas
20700 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
20710 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20720 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
20730 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34  Key);.    case 4
20740 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
20750 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20760 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   );.      y = FO
20770 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20780 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  y);.      return
20790 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
207a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
207b0 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  5: {.      testc
207c0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
207d0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
207e0 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  n FOUR_BYTE_UINT
207f0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
20800 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
20810 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20820 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
20830 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  {.      u64 x = 
20840 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20850 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
20860 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
20870 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  80 );.      x = 
20880 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
20890 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
208a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
208b0 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i64)*(i64*)&x;. 
208c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
208d0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  rn (serial_type 
208e0 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 8);.}../*.** T
208f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
20900 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
20910 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
20920 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
20930 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
20940 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
20950 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
20960 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
20970 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
20980 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
20990 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
209a0 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
209b0 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
209c0 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
209d0 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
209e0 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
209f0 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
20a00 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
20a10 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
20a20 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
20a30 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
20a40 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
20a50 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
20a60 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
20a70 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
20a80 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73  rgument bSkip is
20a90 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73   non-zero, it is
20aa0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
20ab0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
20ac0 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  eady.** determin
20ad0 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
20ae0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
20af0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a  keys are equal..
20b00 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
20b10 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
20b20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
20b30 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
20b40 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a  elds. If all .**
20b50 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70   fields that app
20b60 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73  ear in both keys
20b70 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
20b80 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20b90 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  _rc is .** retur
20ba0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  ned..**.** If da
20bb0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
20bc0 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c  n is discovered,
20bd0 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72   set pPKey2->err
20be0 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49  Code to .** SQLI
20bf0 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72  TE_CORRUPT and r
20c00 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f  eturn 0. If an O
20c10 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
20c20 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b  untered, .** pPK
20c30 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20  ey2->errCode is 
20c40 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
20c50 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69  MEM and, if it i
20c60 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a  s not NULL, the.
20c70 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  ** malloc-failed
20c80 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74   flag set on dat
20c90 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50  abase handle (pP
20ca0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20cb0 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  db)..*/.int sqli
20cc0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20cd0 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20  pareWithSkip(.  
20ce0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
20cf0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
20d00 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
20d10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
20d20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
20d30 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20d40 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
20d70 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
20d80 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
20d90 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
20da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20db0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
20dc0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
20dd0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
20de0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
20df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20e00 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
20e10 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
20e20 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
20e50 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
20e60 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
20e70 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
20e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
20e90 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
20ea0 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
20eb0 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
20ee0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
20ef0 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
20f00 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
20f10 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
20f20 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
20f30 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
20f40 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
20f50 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
20f60 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
20f70 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
20f80 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
20f90 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
20fa0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
20fb0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
20fc0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
20fd0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
20fe0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
20ff0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
21000 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
21010 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
21020 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
21030 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
21040 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
21050 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
21060 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
21070 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
21080 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
21090 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
210a0 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
210b0 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
210c0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
210d0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
210e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
210f0 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
21100 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
21110 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
21120 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
21130 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
21140 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 20 3d   szHdr1;.    i =
21150 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 31   0;.  }.  if( d1
21160 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
21170 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79 32 2d   ){ .    pPKey2-
21180 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
21190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
211a0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
211b0 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
211c0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   */.  }..  VVA_O
211d0 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
211e0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
211f0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
21200 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
21210 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
21220 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
21230 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
21240 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
21250 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
21260 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
21270 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
21280 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
21290 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
212a0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  >pKeyInfo->nKeyF
212b0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
212c0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
212d0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
212e0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
212f0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
21300 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
21310 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
21320 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21330 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
21340 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
21350 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
21360 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
21370 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
21380 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
21390 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
213a0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
213b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
213c0 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
213d0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
213e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
213f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
21400 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21410 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
21420 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
21430 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
21440 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71          rc = -sq
21450 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
21460 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20  pare(pRhs->u.i, 
21470 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20  mem1.u.r);.     
21480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21490 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
214a0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
214b0 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
214c0 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
214d0 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
214e0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
214f0 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
21500 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
21510 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
21520 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
21530 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
21540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
21560 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
21570 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
21580 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
21590 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
215a0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
215b0 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
215c0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
215d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
215e0 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
215f0 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
21600 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
21610 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
21620 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
21630 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
21640 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
21650 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
21660 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
21670 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
21680 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
21690 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
216a0 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
216b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
216c0 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
216d0 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
216e0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
216f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
21700 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
21710 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21720 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21740 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
21750 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
21760 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
21770 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
21780 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
21790 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
217a0 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  <pRhs->u.r ){.  
217b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
217c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
217d0 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
217e0 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
217f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
21800 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21820 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21830 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
21840 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68  re(mem1.u.i, pRh
21850 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20  s->u.r);.       
21860 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21870 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
21880 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
21890 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
218a0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
218b0 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
218c0 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
218d0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
218e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
218f0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
21900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
21910 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
21920 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
21930 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21940 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
21950 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
21960 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
21970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
21980 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
21990 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
219a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
219b0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
219c0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
219d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
219e0 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
219f0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
21a00 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
21a10 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
21a20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 0a  (unsigned)nKey1.
21a30 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4b 65           || (pKe
21a40 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
21a50 70 4b 65 79 49 6e 66 6f 29 2d 3e 6e 41 6c 6c 46  pKeyInfo)->nAllF
21a60 69 65 6c 64 3c 3d 69 0a 20 20 20 20 20 20 20 20  ield<=i.        
21a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
21a80 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
21a90 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
21aa0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
21ab0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
21ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
21ad0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
21ae0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
21af0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
21b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
21b10 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
21b20 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
21b30 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
21b40 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
21b50 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
21b60 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
21b70 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
21b80 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
21b90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
21ba0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
21bb0 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
21bc0 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
21bd0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
21be0 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
21bf0 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
21c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21c10 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
21c20 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
21c30 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
21c40 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
21c50 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
21c60 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
21c70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21c80 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
21c90 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
21ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21cb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
21cc0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
21cd0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
21ce0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21cf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21d00 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  ( (pRhs->flags &
21d10 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
21d20 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20   pRhs->n==0 );. 
21d30 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
21d40 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
21d50 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
21d60 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
21d70 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
21d80 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
21d90 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72  _type<12 || (ser
21da0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
21db0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21dc0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
21dd0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
21de0 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
21df0 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
21e00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21e10 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67  d1+nStr)==(unsig
21e20 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
21e30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21e40 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73  d1+nStr+1)==(uns
21e50 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
21e60 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e         if( (d1+n
21e70 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  Str) > (unsigned
21e80 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
21e90 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21ea0 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21eb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21ec0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21ed0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21ee0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
21ef0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
21f00 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
21f10 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
21f20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73           if( !is
21f30 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63  AllZero((const c
21f40 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c  har*)&aKey1[d1],
21f50 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20  nStr) ){.       
21f60 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
21f70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21f80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
21f90 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a  Str - pRhs->u.nZ
21fa0 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ero;.          }
21fb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21fc0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
21fd0 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70  mp = MIN(nStr, p
21fe0 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
21ff0 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
22000 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
22010 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
22020 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
22030 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
22040 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s->n;.        }.
22050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22060 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c     /* RHS is nul
22070 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20  l */.    else{. 
22080 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
22090 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
220a0 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69        rc = (seri
220b0 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20  al_type!=0);.   
220c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
220d0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
220e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
220f0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
22100 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
22110 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
22120 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
22130 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
22140 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
22150 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
22160 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
22170 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
22180 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
22190 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
221a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
221b0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66  .    i++;.    if
221c0 28 20 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  ( i==pPKey2->nFi
221d0 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  eld ) break;.   
221e0 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
221f0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
22200 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
22210 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
22220 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
22230 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
22240 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
22250 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
22260 48 64 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73  Hdr1 && d1<=(uns
22270 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
22280 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
22290 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
222a0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
222b0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
222c0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
222d0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
222e0 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
222f0 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
22300 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
22310 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
22320 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
22330 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
22340 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
22350 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
22360 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
22370 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
22380 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
22390 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
223a0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
223b0 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
223c0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
223d0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
223e0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
223f0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
22400 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
22410 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
22420 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
22430 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
22440 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
22450 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
22460 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
22470 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70      || pPKey2->p
22480 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
22490 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
224a0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
224b0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 1;.  return pP
224c0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
224d0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
224e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
224f0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
22500 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
22510 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
22520 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
22530 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
22540 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
22550 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
22560 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22570 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
22580 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
22590 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
225a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
225b0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
225c0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
225d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
225e0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
225f0 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
22600 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
22610 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
22620 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
22630 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
22640 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
22650 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
22660 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
22670 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
22680 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
22690 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
226a0 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
226b0 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
226c0 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
226d0 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
226e0 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
226f0 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
22700 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
22710 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
22720 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
22730 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
22740 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
22750 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
22760 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
22770 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
22780 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
22790 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
227a0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
227b0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
227c0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
227d0 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
227e0 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
227f0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
22800 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
22810 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
22820 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
22830 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a  u64 x;.  i64 v;.
22840 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64    i64 lhs;..  vd
22850 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
22860 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
22870 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22880 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
22890 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a    assert( (*(u8*
228a0 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c  )pKey1)<=0x3F ||
228b0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
228c0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
228d0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
228e0 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
228f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
22900 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e  /.      lhs = ON
22910 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
22920 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22930 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
22940 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22950 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
22960 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
22970 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
22980 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  s = TWO_BYTE_INT
22990 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
229a0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
229b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
229c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
229d0 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
229e0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
229f0 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f      lhs = THREE_
22a00 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
22a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22a20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
22a30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22a40 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
22a50 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
22a60 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
22a70 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
22a80 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  Key);.      lhs 
22a90 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  = (i64)*(int*)&y
22aa0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22ab0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
22ac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22ad0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
22ae0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
22af0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
22b00 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  s = FOUR_BYTE_UI
22b10 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
22b20 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
22b30 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
22b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22b50 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
22b60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22b70 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62  case 6: { /* 8-b
22b80 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
22b90 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20  er */.      x = 
22ba0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
22bb0 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  Key);.      x = 
22bc0 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
22bd0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
22be0 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28  ;.      lhs = *(
22bf0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74  i64*)&x;.      t
22c00 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
22c10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22c20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
22c30 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b   .      lhs = 0;
22c40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22c50 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20    case 9:.      
22c60 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  lhs = 1;.      b
22c70 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  reak;..    /* Th
22c80 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65  is case could be
22c90 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74   removed without
22ca0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65   changing the re
22cb0 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67  sults of running
22cc0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  .    ** this cod
22cd0 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20  e. Including it 
22ce0 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65  causes gcc to ge
22cf0 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20  nerate a faster 
22d00 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73  switch .    ** s
22d10 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20  tatement (since 
22d20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69  the range of swi
22d30 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20  tch targets now 
22d40 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61  starts at zero a
22d50 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e  nd.    ** is con
22d60 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65  tiguous) but doe
22d70 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
22d80 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74  duplicate code t
22d90 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
22da0 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73     ** (as gcc is
22db0 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74   clever enough t
22dc0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77  o combine the tw
22dd0 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f  o like cases). O
22de0 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  ther .    ** com
22df0 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20  pilers might be 
22e00 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20  similar.  */ .  
22e10 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37    case 0: case 7
22e20 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
22e30 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22e40 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
22e50 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a  Key1, pPKey2);..
22e60 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
22e70 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
22e80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22e90 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
22ea0 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20   pPKey2);.  }.. 
22eb0 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65   v = pPKey2->aMe
22ec0 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20  m[0].u.i;.  if( 
22ed0 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v>lhs ){.    res
22ee0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
22ef0 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73   }else if( v<lhs
22f00 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
22f10 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73  Key2->r2;.  }els
22f20 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46  e if( pPKey2->nF
22f30 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ield>1 ){.    /*
22f40 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
22f50 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
22f60 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d  s are equal. Com
22f70 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e  pare the trailin
22f80 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  g .    ** fields
22f90 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  .  */.    res = 
22fa0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22fb0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
22fc0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
22fd0 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
22fe0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
22ff0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
23000 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
23010 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
23020 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
23030 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
23040 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
23050 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
23060 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
23070 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
23080 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65  ult_rc;.    pPKe
23090 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
230a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
230b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
230c0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
230d0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
230e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
230f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
23100 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
23110 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
23120 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
23130 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
23140 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
23150 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
23160 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
23170 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
23180 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
23190 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
231a0 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
231b0 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
231c0 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
231d0 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
231e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
231f0 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
23200 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
23210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23220 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
23230 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
23240 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
23250 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
23260 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
23270 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
23280 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
23290 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
232a0 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28  st u8 *aKey1 = (
232b0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b  const u8*)pKey1;
232c0 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
232d0 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pe;.  int res;..
232e0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
232f0 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20  ->aMem[0].flags 
23300 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76  & MEM_Str );.  v
23310 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
23320 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
23330 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
23340 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  Key2->pKeyInfo);
23350 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  .  getVarint32(&
23360 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c  aKey1[1], serial
23370 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65  _type);.  if( se
23380 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
23390 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
233a0 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r1;      /* (p
233b0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
233c0 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c   number or a nul
233d0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  l */.  }else if(
233e0 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
233f0 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72   0x01) ){ .    r
23400 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
23410 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
23420 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62  nKey1) is a blob
23430 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
23440 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69   int nCmp;.    i
23450 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74  nt nStr;.    int
23460 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30   szHdr = aKey1[0
23470 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28  ];..    nStr = (
23480 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20  serial_type-12) 
23490 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a  / 2;.    if( (sz
234a0 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b  Hdr + nStr) > nK
234b0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b  ey1 ){.      pPK
234c0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
234d0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
234e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
234f0 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f  turn 0;    /* Co
23500 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
23510 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  }.    nCmp = MIN
23520 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
23530 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20  ].n, nStr );.   
23540 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61   res = memcmp(&a
23550 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b  Key1[szHdr], pPK
23560 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20  ey2->aMem[0].z, 
23570 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  nCmp);..    if( 
23580 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
23590 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b  res = nStr - pPK
235a0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a  ey2->aMem[0].n;.
235b0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
235c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
235d0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
235e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
235f0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
23600 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
23610 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
23620 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
23630 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23640 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
23650 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
23660 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  ;.          pPKe
23670 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
23680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23690 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
236a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
236b0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
236c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
236d0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
236e0 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
236f0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
23700 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
23710 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
23720 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
23730 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
23740 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
23750 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
23760 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
23770 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
23780 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
23790 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
237a0 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
237b0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
237c0 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
237d0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
237e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
237f0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
23800 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23810 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
23820 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
23830 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
23840 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
23850 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
23860 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
23870 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
23880 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
23890 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
238a0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
238b0 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
238c0 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
238d0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
238e0 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
238f0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
23900 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
23910 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
23920 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
23930 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
23940 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
23950 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
23960 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
23970 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
23980 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
23990 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
239a0 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
239b0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
239c0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
239d0 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
239e0 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
239f0 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
23a00 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
23a10 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
23a20 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
23a30 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
23a40 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
23a50 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
23a60 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
23a70 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
23a80 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
23a90 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
23aa0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
23ab0 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
23ac0 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
23ad0 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
23ae0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
23af0 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
23b00 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
23b10 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
23b20 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
23b30 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
23b40 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
23b50 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
23b60 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
23b70 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
23b80 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
23b90 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
23ba0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
23bb0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
23bc0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
23bd0 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
23be0 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
23bf0 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
23c00 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66    if( p->pKeyInf
23c10 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33  o->nAllField<=13
23c20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
23c30 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
23c40 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
23c50 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
23c60 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
23c70 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
23c80 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
23c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23ca0 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
23cb0 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
23cc0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
23cd0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
23ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
23cf0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
23d00 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
23d10 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
23d20 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
23d30 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
23d40 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
23d50 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
23d60 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
23d70 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
23d80 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
23d90 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
23da0 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
23db0 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
23dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
23dd0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
23de0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
23df0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
23e00 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
23e10 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
23e20 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23e30 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
23e40 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
23e50 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
23e60 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
23e70 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
23e80 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
23e90 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
23ea0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
23eb0 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
23ec0 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
23ed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23ee0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
23ef0 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
23f00 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
23f10 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
23f20 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
23f30 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
23f40 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
23f50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
23f60 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
23f70 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
23f80 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
23f90 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
23fa0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
23fb0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
23fc0 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
23fd0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
23fe0 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
23ff0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
24000 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
24010 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
24020 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
24030 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
24040 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
24050 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
24060 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
24070 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
24080 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
24090 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
240a0 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
240b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
240c0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
240d0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
240e0 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
240f0 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
24100 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
24110 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
24120 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
24130 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
24140 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
24150 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
24160 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
24170 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
24180 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
24190 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
241a0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
241b0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
241c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
241d0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
241e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65  d(pCur) );.  nCe
241f0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  llKey = sqlite3B
24200 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
24210 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28  pCur);.  assert(
24220 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
24230 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
24240 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
24250 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
24260 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
24270 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
24280 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
24290 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
242a0 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
242b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
242c0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
242d0 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
242e0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
242f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24300 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
24310 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
24320 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
24330 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
24340 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
24350 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
24360 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
24370 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
24380 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
24390 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
243a0 7a 48 64 72 3e 30 78 37 66 66 66 66 66 66 66 20  zHdr>0x7fffffff 
243b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e  );.  assert( m.n
243c0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  >=0 );.  if( unl
243d0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
243e0 20 73 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64   szHdr>(unsigned
243f0 29 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  )m.n) ){.    got
24400 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
24410 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
24420 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
24430 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
24440 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
24450 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
24460 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
24470 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
24480 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
24490 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
244a0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
244b0 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
244c0 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
244d0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
244e0 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
244f0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
24500 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
24510 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
24520 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
24530 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
24540 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
24550 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
24560 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
24570 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
24580 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
24590 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
245a0 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
245b0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
245c0 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
245d0 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
245e0 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
245f0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
24600 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
24610 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
24620 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
24630 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74  [typeRowid];.  t
24640 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
24650 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
24660 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
24670 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
24680 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
24690 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
246a0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
246b0 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
246c0 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
246d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
246e0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
246f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
24700 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
24710 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
24720 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
24730 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
24740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
24750 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
24760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24770 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
24780 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
24790 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
247a0 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
247b0 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
247c0 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
247d0 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
247e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
247f0 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
24800 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
24810 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c  stcase( m.szMall
24820 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
24830 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
24840 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
24850 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24860 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
24870 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
24880 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
24890 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
248a0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67  s pointing to ag
248b0 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
248c0 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61   string in pUnpa
248d0 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74  cked.  Write int
248e0 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
248f0 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
24900 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
24910 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
24920 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
24930 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
24940 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b  ter than pUnpack
24950 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ed.  Return SQLI
24960 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
24970 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65  ..**.** pUnpacke
24980 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  d is either crea
24990 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
249a0 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
249b0 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
249c0 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
249d0 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
249e0 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
249f0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
24a00 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
24a10 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
24a20 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
24a30 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
24a40 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
24a50 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
24a60 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
24a70 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
24a80 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69  entire key..*/.i
24a90 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
24aa0 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73  xKeyCompare(.  s
24ab0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
24ae0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
24af0 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b10 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
24b20 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
24b30 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
24b40 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20  d *pUnpacked,   
24b50 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
24b60 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a  version of key *
24b70 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
24ba0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
24bb0 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
24bc0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
24bd0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
24be0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
24bf0 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
24c00 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
24c10 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
24c20 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75  ;.  pCur = pC->u
24c30 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73  c.pCursor;.  ass
24c40 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24c50 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
24c60 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b  Cur) );.  nCellK
24c70 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
24c80 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
24c90 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65  r);.  /* nCellKe
24ca0 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
24cb0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
24cc0 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
24cd0 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
24ce0 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
24cf0 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
24d00 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
24d10 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
24d20 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
24d30 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
24d40 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
24d50 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
24d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24d70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24d80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
24d90 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
24da0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
24db0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
24dc0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
24dd0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29  32)nCellKey, &m)
24de0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
24df0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24e00 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
24e10 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24e20 72 65 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20  reWithSkip(m.n, 
24e30 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20  m.z, pUnpacked, 
24e40 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
24e50 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
24e60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24e70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
24e80 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
24e90 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
24ea0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
24eb0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
24ec0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
24ed0 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
24ee0 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
24ef0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
24f00 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
24f10 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
24f20 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
24f30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24f40 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
24f50 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
24f60 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
24f70 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
24f80 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
24f90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
24fa0 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
24fb0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
24fc0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
24fd0 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
24fe0 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
24ff0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
25000 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
25010 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
25020 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
25030 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
25040 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
25050 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
25060 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
25070 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
25080 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
25090 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
250a0 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
250b0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
250c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
250d0 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
250e0 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
250f0 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
25100 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
25110 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
25120 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
25130 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
25140 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
25150 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
25160 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
25170 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
25180 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
25190 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
251a0 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
251b0 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
251c0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
251d0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20  .**.** If iCode 
251e0 69 73 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72  is 1, then expir
251f0 61 74 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72  ation is advisor
25200 79 2e 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  y.  The statemen
25210 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  t should.** be r
25220 65 70 72 65 70 61 72 65 64 20 62 65 66 6f 72 65  eprepared before
25230 20 62 65 69 6e 67 20 72 65 73 74 61 72 74 65 64   being restarted
25240 2c 20 62 75 74 20 69 66 20 69 74 20 69 73 20 61  , but if it is a
25250 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a  lready running.*
25260 2a 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20  * it is allowed 
25270 74 6f 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  to run to comple
25280 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  tion..**.** Inte
25290 72 6e 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rnally, this fun
252a0 63 74 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20  ction just sets 
252b0 74 68 65 20 56 64 62 65 2e 65 78 70 69 72 65 64  the Vdbe.expired
252c0 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20   flag on all.** 
252d0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
252e0 6e 74 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69  nts.  The flag i
252f0 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61  s set to 1 for a
25300 6e 20 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69  n immediate expi
25310 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65  ration.** and se
25320 74 20 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64  t to 2 for an ad
25330 76 69 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f  visory expiratio
25340 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
25350 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
25360 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
25370 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64  e3 *db, int iCod
25380 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  e){.  Vdbe *p;. 
25390 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
253a0 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
253b0 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
253c0 65 64 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20  ed = iCode+1;.  
253d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
253e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
253f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
25400 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
25410 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
25420 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
25430 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
25440 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25450 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20   SQLITE_PREPARE 
25460 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62 65  flags for a Vdbe
25470 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56  ..*/.u8 sqlite3V
25480 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
25490 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
254a0 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b  rn v->prepFlags;
254b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
254c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
254d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
254e0 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
254f0 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
25500 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
25510 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
25520 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
25530 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
25540 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
25550 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
25560 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
25570 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
25580 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
25590 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
255a0 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
255b0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
255c0 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
255d0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
255e0 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
255f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
25600 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
25610 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
25620 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
25630 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
25640 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
25650 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
25660 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
25670 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
25680 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
25690 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
256a0 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e      assert( (v->
256b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
256c0 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
256d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
256e0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
256f0 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
25700 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
25710 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
25720 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
25730 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
25740 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25750 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
25760 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
25770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25780 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
25790 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
257a0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
257b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
257c0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
257d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
257e0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
257f0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
25800 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
25810 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
25820 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
25830 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
25840 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
25850 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
25860 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
25870 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
25880 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
25890 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
258a0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
258b0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
258c0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
258d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d  );.  assert( (v-
258e0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
258f0 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
25900 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  =0 );.  if( iVar
25910 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  >=32 ){.    v->e
25920 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30  xpmask |= 0x8000
25930 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0000;.  }else{. 
25940 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
25950 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
25960 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  r-1));.  }.}../*
25970 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63  .** Cause a func
25980 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e  tion to throw an
25990 20 65 72 72 6f 72 20 69 66 20 69 74 20 77 61 73   error if it was
259a0 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75   call from OP_Pu
259b0 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72  reFunc.** rather
259c0 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f   than OP_Functio
259d0 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65  n..**.** OP_Pure
259e0 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20  Func means that 
259f0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  the function mus
25a00 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74  t be determinist
25a10 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ic, and should.*
25a20 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * throw an error
25a30 20 69 66 20 69 74 20 69 73 20 67 69 76 65 6e 20   if it is given 
25a40 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c  inputs that woul
25a50 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65  d make it non-de
25a60 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20  terministic..** 
25a70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25a80 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f  invoked by date/
25a90 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  time functions t
25aa0 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65  hat use non-dete
25ab0 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61  rministic.** fea
25ac0 74 75 72 65 73 20 73 75 63 68 20 61 73 20 27 6e  tures such as 'n
25ad0 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ow'..*/.int sqli
25ae0 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73  te3NotPureFunc(s
25af0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
25b00 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pCtx){.#ifdef SQ
25b10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
25b20 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
25b30 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20   pCtx->pVdbe==0 
25b40 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
25b50 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70  if.  if( pCtx->p
25b60 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e  Vdbe->aOp[pCtx->
25b70 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  iOp].opcode==OP_
25b80 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  PureFunc ){.    
25b90 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
25ba0 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
25bb0 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e     "non-determin
25bc0 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69  istic function i
25bd0 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  n index expressi
25be0 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73  on or CHECK cons
25bf0 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20  traint",.       
25c00 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
25c10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
25c20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
25c30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
25c40 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
25c50 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
25c60 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
25c70 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
25c80 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
25c90 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
25ca0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
25cb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
25cc0 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
25cd0 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
25ce0 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
25cf0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
25d00 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
25d10 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
25d20 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
25d30 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
25d40 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
25d50 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
25d60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
25d70 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
25d80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25d90 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
25da0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
25db0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
25dc0 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
25dd0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
25de0 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
25df0 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
25e00 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
25e10 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
25e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
25e30 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
25e40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25e50 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
25e60 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  ./*.** If the se
25e70 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
25e80 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61   not NULL, relea
25e90 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f  se any allocatio
25ea0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ns associated .*
25eb0 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72  * with the memor
25ec0 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  y cells in the p
25ed0 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20  ->aMem[] array. 
25ee0 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e  Also free the Un
25ef0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
25f00 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
25f10 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  , using sqlite3D
25f20 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  bFree()..**.** T
25f30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25f40 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70  used to free Unp
25f50 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
25f60 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
25f70 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55   by.** the vdbeU
25f80 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
25f90 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20  nction found in 
25fa0 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74  vdbeapi.c..*/.st
25fb0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
25fc0 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74  eeUnpacked(sqlit
25fd0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65  e3 *db, int nFie
25fe0 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ld, UnpackedReco
25ff0 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
26000 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
26010 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69    for(i=0; i<nFi
26020 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
26030 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
26040 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
26050 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
26060 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
26070 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
26080 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
26090 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
260a0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
260b0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
260c0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
260d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
260e0 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
260f0 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e  TE_HOOK./*.** In
26100 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
26110 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
26120 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
26130 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
26140 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
26150 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
26160 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
26170 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
26180 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
26190 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
261a0 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
261b0 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
261c0 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
261d0 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
261e0 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
261f0 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
26200 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
26210 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
26220 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
26230 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
26240 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
26250 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
26260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26270 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
26280 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
26290 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
262a0 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
262b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
262c0 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
262d0 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
262e0 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
26310 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
26320 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
26330 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
26340 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
26350 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
26360 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26380 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
26390 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
263c0 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
263d0 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263f0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
26400 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
26410 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
26420 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
26430 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
26440 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
26450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
26460 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
26470 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
26480 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
26490 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
264a0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
264b0 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
264c0 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
264d0 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
264e0 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
264f0 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pTab)==0 ){.    
26500 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20  iKey1 = iKey2 = 
26510 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74 65  0;.    preupdate
26520 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  .pPk = sqlite3Pr
26530 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
26540 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
26550 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
26560 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
26570 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
26580 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20  [iReg].u.i;.    
26590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65  }else{.      iKe
265a0 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20  y2 = iKey1;.    
265b0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
265c0 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
265d0 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
265e0 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
265f0 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
26600 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
26610 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
26620 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
26630 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
26640 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
26650 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
26660 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
26670 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
26680 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
26690 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
266a0 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
266b0 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
266c0 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
266d0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
266e0 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  eld = pTab->nCol
266f0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
26700 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yinfo.aSortOrder
26710 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72   = (u8*)&fakeSor
26720 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64  tOrder;.  preupd
26730 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
26740 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
26750 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
26760 70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d  preupdate.pTab =
26770 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50   pTab;..  db->pP
26780 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
26790 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
267a0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
267b0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
267c0 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
267d0 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
267e0 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
267f0 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
26800 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26810 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
26820 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
26830 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
26840 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
26850 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
26860 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
26870 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
26880 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
26890 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
268a0 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
268b0 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
268c0 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
268d0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
268e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
268f0 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
26900 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
26910 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
26920 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
26930 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
26940 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
26950 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
26960 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
26970 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
26980 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
26990 20 2a 2f 0a                                       */.