/ Hex Artifact Content
Login

Artifact 01631f90d84751911f328dd78ae13e1e811c35d4d99864673eef4bba9dccc349:


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 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
34d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
34e0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
34f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3500: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
3510: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
3520: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
3530: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
3540: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
3550: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3560: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3570: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
3580: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
3590: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
35a0: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
35b0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
35f0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
3600: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
3610: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
3620: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
3630: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41  ;.  }.  return A
3640: 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  DDR(i);.}../*.**
3650: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
3660: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
3670: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3680: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
3690: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
36a0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
36b0: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
36c0: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
36d0: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
36e0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
36f0: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
3700: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
3710: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
3720: 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61  *v, int x){.  Pa
3730: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
3740: 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44  se;.  int j = AD
3750: 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28  DR(x);.  assert(
3760: 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   v->magic==VDBE_
3770: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3780: 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61  assert( j<p->nLa
3790: 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  bel );.  assert(
37a0: 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   j>=0 );.  if( p
37b0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64  ->aLabel ){.#ifd
37c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
37d0: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
37e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
37f0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3800: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 52 45        printf("RE
3810: 53 4f 4c 56 45 20 4c 41 42 45 4c 20 25 64 20 74  SOLVE LABEL %d t
3820: 6f 20 25 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e  o %d\n", x, v->n
3830: 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Op);.    }.#endi
3840: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
3850: 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29  >aLabel[j]==(-1)
3860: 20 29 3b 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61   ); /* Labels ma
3870: 79 20 6f 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76  y only be resolv
3880: 65 64 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70  ed once */.    p
3890: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
38a0: 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  >nOp;.  }.}../*.
38b0: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
38c0: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
38d0: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65   only be run one
38e0: 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
38f0: 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c  qlite3VdbeRunOnl
3900: 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a  yOnce(Vdbe *p){.
3910: 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65    p->runOnlyOnce
3920: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
3930: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
3940: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
3950: 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c  y be run multipl
3960: 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e times..*/.void
3970: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
3980: 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  able(Vdbe *p){. 
3990: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
39a0: 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 0;.}..#ifdef S
39b0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
39c0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
39d0: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
39e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
39f0: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
3a00: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
3a10: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
3a20: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
3a30: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
3a40: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
3a50: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
3a60: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
3a70: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
3a80: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
3a90: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
3aa0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
3ab0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
3ac0: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
3ad0: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
3ae0: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
3af0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
3b00: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
3b10: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
3b40: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
3b50: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
3b60: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3b70: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
3b80: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
3b90: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
3ba0: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
3bb0: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
3bc0: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
3bd0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
3be0: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
3bf0: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
3c00: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
3c10: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
3c20: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
3c30: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3c40: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
3c50: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
3c60: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
3c70: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
3c80: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
3c90: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
3ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3cb0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3cc0: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
3cd0: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
3ce0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
3cf0: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
3d00: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
3d10: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d30: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
3d40: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
3d50: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
3d60: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
3d70: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
3d80: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
3d90: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
3da0: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
3db0: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
3dc0: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
3dd0: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
3de0: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
3df0: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
3e00: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
3e10: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
3e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
3e30: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3e40: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
3e50: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
3e60: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
3e70: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
3e80: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
3e90: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
3ea0: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
3eb0: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
3ec0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
3ed0: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
3ee0: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
3ef0: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
3f00: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
3f10: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
3f20: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
3f30: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
3f40: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
3f50: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
3f60: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
3f70: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3f80: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
3f90: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
3fa0: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
3fb0: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
3fc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3fd0: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
3fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
3ff0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
4000: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
4010: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
4020: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
4030: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
4040: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
4050: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
4060: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
4070: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
4080: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
4090: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
40a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
40b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
40c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
40d0: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
40e0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
40f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4100: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
4110: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
4120: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
4130: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
4140: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
4150: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
4160: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
4170: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
4180: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
4190: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
41a0: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
41b0: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
41c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
41d0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
41e0: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
41f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
4200: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
4210: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
4220: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
4230: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
4240: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
4250: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
4260: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
4270: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
4280: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
4290: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
42a0: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
42b0: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
42c0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
42d0: 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42     *  OP_CreateB
42e0: 74 72 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45  tree/BTREE_INTKE
42f0: 59 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  Y and OP_InitCor
4300: 6f 75 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20  outine .**      
4310: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
4320: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
4330: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
4340: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
4350: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
4360: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
4370: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
4380: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
4390: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
43a0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
43b0: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
43c0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
43d0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
43e0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
43f0: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
4400: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
4410: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
4420: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
4430: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
4440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
4450: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
4460: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
4470: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
4480: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
4490: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
44a0: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
44b0: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
44c0: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
44d0: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
44e0: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
44f0: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
4500: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
4510: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
4520: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
4530: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
4540: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
4550: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
4560: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
4570: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
4580: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
4590: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
45a0: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
45b0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
45c0: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
45d0: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
45e0: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
45f0: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
4600: 20 0a 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65   .     || opcode
4610: 3d 3d 4f 50 5f 56 44 65 73 74 72 6f 79 0a 20 20  ==OP_VDestroy.  
4620: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
4630: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
4640: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
4650: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
4660: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
4670: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
4680: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
4690: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
46a0: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
46b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
46c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
46d0: 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74 72  de==OP_CreateBtr
46e0: 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 42  ee && pOp->p3==B
46f0: 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68 61  TREE_INTKEY ) ha
4700: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31  sCreateTable = 1
4710: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
4720: 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  ==OP_InitCorouti
4730: 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f  ne ) hasInitCoro
4740: 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64  utine = 1;.#ifnd
4750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
4760: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69  OREIGN_KEY.    i
4770: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b  f( opcode==OP_Fk
4780: 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e  Counter && pOp->
4790: 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p1==0 && pOp->p2
47a0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ==1 ){.      has
47b0: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20  FkCounter = 1;. 
47c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
47d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
47e0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
47f0: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
4800: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
4810: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
4820: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
4830: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
4840: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
4850: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
4860: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
4870: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
4880: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
4890: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
48a0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
48b0: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
48c0: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
48d0: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
48e0: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
48f0: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
4900: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
4910: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
4920: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
4930: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
4940: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
4950: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c  ort==mayAbort ||
4960: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20   hasFkCounter.  
4970: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
4980: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26  hasCreateTable &
4990: 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  & hasInitCorouti
49a0: 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ne) );.}.#endif 
49b0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
49c0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
49d0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
49e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65  nction */..#ifde
49f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
4a00: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
4a10: 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e 74 65  he nWrite counte
4a20: 72 20 69 6e 20 74 68 65 20 56 44 42 45 20 69 66  r in the VDBE if
4a30: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
4a40: 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d 65 72  ot an.** ephemer
4a50: 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20 69 66  al cursor, or if
4a60: 20 74 68 65 20 63 75 72 73 6f 72 20 61 72 67 75   the cursor argu
4a70: 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  ment is NULL..*/
4a80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4a90: 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65  eIncrWriteCounte
4aa0: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
4ab0: 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20 69 66  ursor *pC){.  if
4ac0: 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20 28 70  ( pC==0.   || (p
4ad0: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
4ae0: 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20 20 20  TYPE_SORTER.    
4af0: 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72 54 79     && pC->eCurTy
4b00: 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53 45 55  pe!=CURTYPE_PSEU
4b10: 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21 70 43  DO.       && !pC
4b20: 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29 0a 20  ->isEphemeral). 
4b30: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72 69 74   ){.    p->nWrit
4b40: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  e++;.  }.}.#endi
4b50: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
4b60: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73  _DEBUG./*.** Ass
4b70: 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72 74 20  ert if an Abort 
4b80: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  at this point in
4b90: 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65 73 75   time might resu
4ba0: 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70 74 0a  lt in a corrupt.
4bb0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ** database..*/.
4bc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4bd0: 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65 28  AssertAbortable(
4be0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
4bf0: 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d 3d 30  rt( p->nWrite==0
4c00: 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   || p->usesStmtJ
4c10: 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64  ournal );.}.#end
4c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
4c30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4c40: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
4c50: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
4c60: 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73  erted.  It loops
4c70: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  .** through all 
4c80: 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  the opcodes and 
4c90: 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65  fixes up some de
4ca0: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29  tails..**.** (1)
4cb0: 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69   For each jump i
4cc0: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20  nstruction with 
4cd0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
4ce0: 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a  lue (a label).**
4cf0: 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65       resolve the
4d00: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20   P2 value to an 
4d10: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a  actual address..
4d20: 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74  **.** (2) Comput
4d30: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
4d40: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4d50: 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 51  s used by any SQ
4d60: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  L function.**   
4d70: 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74    and store that
4d80: 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46   value in *pMaxF
4d90: 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28  uncArgs..**.** (
4da0: 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 64  3) Update the Vd
4db0: 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20  be.readOnly and 
4dc0: 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 66  Vdbe.bIsReader f
4dd0: 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 65  lags to accurate
4de0: 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61  ly.**     indica
4df0: 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 70  te what the prep
4e00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
4e10: 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a  ctually does..**
4e20: 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69  .** (4) Initiali
4e30: 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e  ze the p4.xAdvan
4e40: 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70  ce pointer on op
4e50: 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 69  codes that use i
4e60: 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63  t..**.** (5) Rec
4e70: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
4e80: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74  allocated for st
4e90: 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a  oring labels..**
4ea0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4eb0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74   will only funct
4ec0: 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 66  ion correctly if
4ed0: 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   the mkopcodeh.t
4ee0: 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  cl generator.** 
4ef0: 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73 20 74  script numbers t
4f00: 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 65  he opcodes corre
4f10: 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 74  ctly.  Changes t
4f20: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  o this routine m
4f30: 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69  ust be.** coordi
4f40: 6e 61 74 65 64 20 77 69 74 68 20 63 68 61 6e 67  nated with chang
4f50: 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e  es to mkopcodeh.
4f60: 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tcl..*/.static v
4f70: 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  oid resolveP2Val
4f80: 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ues(Vdbe *p, int
4f90: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b   *pMaxFuncArgs){
4fa0: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
4fb0: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
4fc0: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61  .  Op *pOp;.  Pa
4fd0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
4fe0: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a  >pParse;.  int *
4ff0: 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d  aLabel = pParse-
5000: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
5010: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
5020: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a  >bIsReader = 0;.
5030: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
5040: 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69  p->nOp-1];.  whi
5050: 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  le(1){..    /* O
5060: 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73  nly JUMP opcodes
5070: 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74 20 6c   and the short l
5080: 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c 20 6f  ist of special o
5090: 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 77  pcodes in the sw
50a0: 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f  itch.    ** belo
50b0: 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e  w need to be con
50c0: 73 69 64 65 72 65 64 2e 20 20 54 68 65 20 6d 6b  sidered.  The mk
50d0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
50e0: 72 61 74 6f 72 20 73 63 72 69 70 74 20 67 72 6f  rator script gro
50f0: 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74  ups.    ** all t
5100: 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74 6f 67  hese opcodes tog
5110: 65 74 68 65 72 20 6e 65 61 72 20 74 68 65 20 66  ether near the f
5120: 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 6f  ront of the opco
5130: 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20  de list.  Skip. 
5140: 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65     ** any opcode
5150: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
5160: 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20 62  eed processing b
5170: 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74 68 65  y virtual of the
5180: 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a   fact that.    *
5190: 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74  * it is larger t
51a0: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  han SQLITE_MX_JU
51b0: 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 20  MP_OPCODE, as a 
51c0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
51d0: 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  mization..    */
51e0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
51f0: 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f  code<=SQLITE_MX_
5200: 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20  JUMP_OPCODE ){. 
5210: 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65       /* NOTE: Be
5220: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
5230: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68  mkopcodeh.tcl wh
5240: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
5250: 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  oving.      ** c
5260: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
5270: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 20  witch! */.      
5280: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63  switch( pOp->opc
5290: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ode ){.        c
52a0: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
52b0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  on: {.          
52c0: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
52d0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
52e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  ;.          /* f
52f0: 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
5300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5310: 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  se OP_AutoCommit
5320: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
5330: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
5340: 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52           p->bIsR
5350: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
5360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5370: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
5380: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
5390: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
53a0: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
53b0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
53c0: 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 20  _Vacuum:.       
53d0: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
53e0: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
53f0: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
5400: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
5410: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
5420: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5440: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
5450: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5460: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
5470: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
5480: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
5490: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
54a0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
54b0: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
54c0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
54d0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
54e0: 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79   never codes any
54f0: 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65   of these opcode
5500: 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20  s as a jump.    
5510: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61        ** to a la
5520: 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61  bel.  They are a
5530: 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 61  lways coded as a
5540: 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20   jump backwards 
5550: 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  to a .          
5560: 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73  ** known address
5570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
5580: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30  sert( pOp->p2>=0
5590: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
55a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
55b0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50         case OP_P
55c0: 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  rev: {.         
55d0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
55e0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
55f0: 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20  Previous;.      
5600: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5610: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
5620: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
5630: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65  ode generator ne
5640: 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66  ver codes any of
5650: 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61   these opcodes a
5660: 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20  s a jump.       
5670: 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c     ** to a label
5680: 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 61  .  They are alwa
5690: 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75  ys coded as a ju
56a0: 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20  mp backwards to 
56b0: 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  a .          ** 
56c0: 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f  known address */
56d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
56e0: 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( pOp->p2>=0 );
56f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5700: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e  ;.        }.#ifn
5710: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5720: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
5730: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
5740: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
5750: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
5760: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
5770: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
5780: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
57a0: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
57b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
57c0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   n;.          as
57d0: 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d 3e  sert( (pOp - p->
57e0: 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 20  aOp) >= 3 );.   
57f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5800: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
5810: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
5820: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
5830: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 20  1].p1;.         
5840: 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20   if( n>nMaxArgs 
5850: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a  ) nMaxArgs = n;.
5860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c            /* Fal
5870: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74  l through into t
5880: 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65 20  he default case 
5890: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  */.        }.#en
58a0: 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66 61  dif.        defa
58b0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
58c0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20 29   if( pOp->p2<0 )
58d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
58e0: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
58f0: 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f  cl script has so
5900: 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73   arranged things
5910: 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20   that the only. 
5920: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f             ** no
5930: 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c  n-jump opcodes l
5940: 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ess than SQLITE_
5950: 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65  MX_JUMP_CODE are
5960: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
5970: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
5980: 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  ve non-negative 
5990: 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a  values for P2. *
59a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  /.            as
59b0: 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70  sert( (sqlite3Op
59c0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70  codeProperty[pOp
59d0: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
59e0: 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20 20  G_JUMP)!=0 );.  
59f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5a00: 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c  ( ADDR(pOp->p2)<
5a10: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29  pParse->nLabel )
5a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  ;.            pO
5a30: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41  p->p2 = aLabel[A
5a40: 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20  DDR(pOp->p2)];. 
5a50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5a80: 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63      /* The mkopc
5a90: 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 20  odeh.tcl script 
5aa0: 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 20  has so arranged 
5ab0: 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 20  things that the 
5ac0: 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  only.      ** no
5ad0: 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c  n-jump opcodes l
5ae0: 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ess than SQLITE_
5af0: 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65  MX_JUMP_CODE are
5b00: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
5b10: 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e       ** have non
5b20: 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73  -negative values
5b30: 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20   for P2. */.    
5b40: 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74    assert( (sqlit
5b50: 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  e3OpcodeProperty
5b60: 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50  [pOp->opcode]&OP
5b70: 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20  FLG_JUMP)==0 || 
5b80: 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 20  pOp->p2>=0);.   
5b90: 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d 3d   }.    if( pOp==
5ba0: 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a  p->aOp ) break;.
5bb0: 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20      pOp--;.  }. 
5bc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
5bd0: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
5be0: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
5bf0: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
5c00: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
5c10: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
5c20: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
5c30: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
5c40: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
5c50: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
5c60: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
5c70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
5c80: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
5c90: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
5ca0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
5cb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
5cc0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
5cd0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
5ce0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5cf0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5d00: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
5d10: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
5d20: 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f  hat at least N o
5d30: 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20  pcode slots are 
5d40: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77  available in p w
5d50: 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67  ithout.** having
5d60: 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d   to malloc for m
5d70: 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70  ore space (excep
5d80: 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  t when compiled 
5d90: 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
5da0: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
5db0: 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65  ESS).  This inte
5dc0: 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75  rface is used du
5dd0: 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20  ring testing.** 
5de0: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63  to verify that c
5df0: 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20  ertain calls to 
5e00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e10: 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72  List() can never
5e20: 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20  .** fail due to 
5e30: 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20  a OOM fault and 
5e40: 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72  hence that the r
5e50: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
5e60: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
5e70: 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20  ddOpList() will 
5e80: 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55  always be non-NU
5e90: 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  LL..*/.#if defin
5ea0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
5eb0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5ec0: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
5ed0: 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71  _STRESS).void sq
5ee0: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e  lite3VdbeVerifyN
5ef0: 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28  oMallocRequired(
5f00: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  Vdbe *p, int N){
5f10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5f20: 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 6e 4f 70 41  p + N <= p->nOpA
5f30: 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  lloc );.}.#endif
5f40: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
5f50: 68 61 74 20 74 68 65 20 56 4d 20 70 61 73 73 65  hat the VM passe
5f60: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
5f70: 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  gument does not 
5f80: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50  contain.** an OP
5f90: 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
5fa0: 65 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72  e. Fail an asser
5fb0: 74 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20  t() if it does. 
5fc0: 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
5fd0: 62 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d  by code in pragm
5fe0: 61 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68  a.c to ensure th
5ff0: 61 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  at the implement
6000: 61 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e  ation of certain
6010: 0a 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70  .** pragmas comp
6020: 6f 72 74 73 20 77 69 74 68 20 74 68 65 20 66 6c  orts with the fl
6030: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 69 6e  ags specified in
6040: 20 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62   the mkpragmatab
6050: 2e 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a  .tcl.** script..
6060: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
6070: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
6080: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6090: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
60a0: 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  ESS).void sqlite
60b0: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73  3VdbeVerifyNoRes
60c0: 75 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b  ultRow(Vdbe *p){
60d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
60e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
60f0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
6100: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
6110: 65 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  e!=OP_ResultRow 
6120: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
6130: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
6140: 63 6f 64 65 20 28 61 20 73 69 6e 67 6c 65 20 4f  code (a single O
6150: 50 5f 41 62 6f 72 74 61 62 6c 65 20 6f 70 63 6f  P_Abortable opco
6160: 64 65 29 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  de) that will.**
6170: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
6180: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 63 61   VDBE program ca
6190: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 20 41 62  n safely call Ab
61a0: 6f 72 74 20 69 6e 20 74 68 65 20 63 75 72 72 65  ort in the curre
61b0: 6e 74 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a  nt.** context..*
61c0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
61d0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64  LITE_DEBUG).void
61e0: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
61f0: 66 79 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65  fyAbortable(Vdbe
6200: 20 2a 70 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72   *p, int onError
6210: 29 7b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  ){.  if( onError
6220: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 20 73 71 6c  ==OE_Abort ) sql
6230: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
6240: 2c 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 29 3b  , OP_Abortable);
6250: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6260: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
6270: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
6280: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
6290: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
62a0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
62b0: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
62c0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
62d0: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
62e0: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
62f0: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
6300: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
6310: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
6320: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
6330: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
6340: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
6350: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
6360: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
6370: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
6380: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6390: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
63a0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
63b0: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
63c0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
63d0: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
63e0: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
63f0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
6400: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
6410: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
6420: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
6430: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
6440: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
6450: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
6460: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
6470: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
6480: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
6490: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
64a0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
64b0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
64c0: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
64d0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
64e0: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
64f0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
6500: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
6510: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
6520: 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c  assert( DbMaskAl
6530: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
6540: 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  sk) );..  resolv
6550: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
6560: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
6570: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
6580: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
6590: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
65a0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
65b0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
65c0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
65d0: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a  tack.  Return a.
65e0: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
65f0: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
6600: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
6610: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72  * Non-zero P2 ar
6620: 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20  guments to jump 
6630: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
6640: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
6650: 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68  djusted.** so th
6660: 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67  at the jump targ
6670: 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74  et is relative t
6680: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
6690: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
66a0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
66b0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
66c0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74  /* Add opcodes t
66f0: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
6700: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
6710: 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t nOp,          
6720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6730: 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20  mber of opcodes 
6740: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65  to add */.  Vdbe
6750: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
6760: 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p,       /* The 
6770: 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64  opcodes to be ad
6780: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ded */.  int iLi
6790: 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  neno            
67a0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d        /* Source-
67b0: 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  file line number
67c0: 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65   of first opcode
67d0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
67e0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20    VdbeOp *pOut, 
67f0: 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72  *pFirst;.  asser
6800: 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  t( nOp>0 );.  as
6810: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6820: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6830: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
6840: 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c  + nOp > p->nOpAl
6850: 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72  loc && growOpArr
6860: 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20  ay(p, nOp) ){.  
6870: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6880: 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20    pFirst = pOut 
6890: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
68a0: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
68b0: 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c  nOp; i++, aOp++,
68c0: 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f   pOut++){.    pO
68d0: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70  ut->opcode = aOp
68e0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f  ->opcode;.    pO
68f0: 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31  ut->p1 = aOp->p1
6900: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d  ;.    pOut->p2 =
6910: 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73   aOp->p2;.    as
6920: 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30  sert( aOp->p2>=0
6930: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c   );.    if( (sql
6940: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
6950: 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20  ty[aOp->opcode] 
6960: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
6970: 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b   && aOp->p2>0 ){
6980: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  .      pOut->p2 
6990: 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  += p->nOp;.    }
69a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20  .    pOut->p3 = 
69b0: 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75  aOp->p3;.    pOu
69c0: 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  t->p4type = P4_N
69d0: 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74  OTUSED;.    pOut
69e0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20  ->p4.p = 0;.    
69f0: 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69  pOut->p5 = 0;.#i
6a00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6a10: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
6a20: 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43  NTS.    pOut->zC
6a30: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
6a40: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
6a50: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
6a60: 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e     pOut->iSrcLin
6a70: 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23  e = iLineno+i;.#
6a80: 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69  else.    (void)i
6a90: 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23  Lineno;.#endif.#
6aa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6ab0: 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  UG.    if( p->db
6ac0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6ad0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
6ae0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6af0: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
6b00: 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70  +p->nOp, &p->aOp
6b10: 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20  [i+p->nOp]);.   
6b20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
6b30: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
6b40: 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a   return pFirst;.
6b50: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
6b60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
6b70: 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a  T_SCANSTATUS)./*
6b80: 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79  .** Add an entry
6b90: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
6ba0: 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65   counters manage
6bb0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d  d by sqlite3_stm
6bc0: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a  t_scanstatus()..
6bd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6be0: 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20  dbeScanStatus(. 
6bf0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63   /* VM to add sc
6c20: 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f  anstatus() to */
6c30: 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61  .  int addrExpla
6c40: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
6c50: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6c60: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20   OP_Explain (or 
6c70: 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  0) */.  int addr
6c80: 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  Loop,           
6c90: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
6ca0: 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74  ss of loop count
6cb0: 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64  er */ .  int add
6cc0: 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20  rVisit,         
6cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6ce0: 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69  ess of rows visi
6cf0: 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ted counter */. 
6d00: 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20   LogEst nEst,   
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
6d30: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
6d40: 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ows */.  const c
6d50: 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
6d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
6d70: 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64   of table or ind
6d80: 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  ex being scanned
6d90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
6da0: 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31  te = (p->nScan+1
6db0: 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 53  ) * sizeof(ScanS
6dc0: 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 74  tatus);.  ScanSt
6dd0: 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e  atus *aNew;.  aN
6de0: 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75 73  ew = (ScanStatus
6df0: 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  *)sqlite3DbReall
6e00: 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63  oc(p->db, p->aSc
6e10: 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  an, nByte);.  if
6e20: 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 63  ( aNew ){.    Sc
6e30: 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20 3d  anStatus *pNew =
6e40: 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b   &aNew[p->nScan+
6e50: 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  +];.    pNew->ad
6e60: 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 72  drExplain = addr
6e70: 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65  Explain;.    pNe
6e80: 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64  w->addrLoop = ad
6e90: 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77  drLoop;.    pNew
6ea0: 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61 64  ->addrVisit = ad
6eb0: 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e 65  drVisit;.    pNe
6ec0: 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a  w->nEst = nEst;.
6ed0: 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20      pNew->zName 
6ee0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
6ef0: 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  p(p->db, zName);
6f00: 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20  .    p->aScan = 
6f10: 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  aNew;.  }.}.#end
6f20: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
6f30: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
6f40: 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31  he opcode, or P1
6f50: 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35 20  , P2, P3, or P5 
6f60: 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20  operands.** for 
6f70: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
6f80: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
6f90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6fa0: 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c  eOpcode(Vdbe *p,
6fb0: 20 75 33 32 20 61 64 64 72 2c 20 75 38 20 69 4e   u32 addr, u8 iN
6fc0: 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c  ewOpcode){.  sql
6fd0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
6fe0: 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  addr)->opcode = 
6ff0: 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f  iNewOpcode;.}.vo
7000: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7010: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
7020: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
7030: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
7040: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
7050: 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p1 = val;.}.void
7060: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7070: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
7080: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
7090: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
70a0: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 32  etOp(p,addr)->p2
70b0: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
70c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
70d0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
70e0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
70f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
7100: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d  Op(p,addr)->p3 =
7110: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
7120: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7130: 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20 70 35  (Vdbe *p, u16 p5
7140: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
7150: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nOp>0 || p->db->
7160: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7170: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 29    if( p->nOp>0 )
7180: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
7190: 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a  ].p5 = p5;.}../*
71a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
71b0: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
71c0: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
71d0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
71e0: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
71f0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
7200: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
7210: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
7220: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7230: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
7240: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
7250: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
7260: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
7270: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
7280: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
7290: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
72a0: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
72b0: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
72c0: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
72d0: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
72e0: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
72f0: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
7300: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71  meralFunction(sq
7310: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
7320: 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28  ef *pDef){.  if(
7330: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
7340: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
7350: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
7360: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7370: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
7380: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
7390: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
73a0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
73b0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
73c0: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
73d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
73e0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
73f0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65  INLINE void free
7400: 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64  P4Mem(sqlite3 *d
7410: 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66  b, Mem *p){.  if
7420: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20  ( p->szMalloc ) 
7430: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7440: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
7450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7460: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
7470: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
7480: 45 20 76 6f 69 64 20 66 72 65 65 50 34 46 75 6e  E void freeP4Fun
7490: 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a 64 62  cCtx(sqlite3 *db
74a0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
74b0: 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45 70 68  t *p){.  freeEph
74c0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
74d0: 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 73  b, p->pFunc);. s
74e0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
74f0: 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20  b, p);.}.static 
7500: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
7510: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
7520: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
7530: 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a    assert( db );.
7540: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
7550: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
7560: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
7570: 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 64   freeP4FuncCtx(d
7580: 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b, (sqlite3_cont
7590: 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  ext*)p4);.      
75a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
75b0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
75c0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
75d0: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59  :.    case P4_DY
75e0: 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65 20  NAMIC:.    case 
75f0: 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20  P4_DYNBLOB:.    
7600: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
7610: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7620: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
7630: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7640: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7650: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
7660: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
7670: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
7680: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
7690: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
76a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
76b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
76c0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
76d0: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
76e0: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  XPR: {.      sql
76f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
7700: 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20  b, (Expr*)p4);. 
7710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7720: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
7730: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
7740: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
7750: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
7760: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
7770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7780: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
7790: 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64  M: {.      if( d
77a0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
77b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
77c0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
77d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
77e0: 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
77f0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34 4d  .        freeP4M
7800: 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29  em(db, (Mem*)p4)
7810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7820: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7830: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
7840: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
7850: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
7860: 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c  ) sqlite3VtabUnl
7870: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34  ock((VTable *)p4
7880: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7890: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
78a0: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
78b0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
78c0: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
78d0: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
78e0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
78f0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
7900: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
7910: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
7920: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
7930: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
7940: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
7950: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
7960: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
7970: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
7980: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
7990: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
79a0: 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f 70  for(pOp=&aOp[nOp
79b0: 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 70  -1]; pOp>=aOp; p
79c0: 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Op--){.      if(
79d0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d 20   pOp->p4type <= 
79e0: 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29 20  P4_FREE_IF_LE ) 
79f0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
7a00: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
7a10: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
7a20: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
7a30: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
7a40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7a50: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7a60: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
7a70: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
7a80: 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70 29  bFreeNN(db, aOp)
7a90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
7aa0: 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72  ink the SubProgr
7ab0: 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  am object passed
7ac0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
7ad0: 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  rgument into the
7ae0: 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20   linked.** list 
7af0: 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67  at Vdbe.pSubProg
7b00: 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69  ram. This list i
7b10: 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65  s used to delete
7b20: 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d   all sub-program
7b30: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e  .** objects when
7b40: 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f   the VM is no lo
7b50: 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
7b60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7b70: 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d  beLinkSubProgram
7b80: 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75  (Vdbe *pVdbe, Su
7b90: 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20  bProgram *p){.  
7ba0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65  p->pNext = pVdbe
7bb0: 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56  ->pProgram;.  pV
7bc0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20  dbe->pProgram = 
7bd0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  p;.}../*.** Chan
7be0: 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74  ge the opcode at
7bf0: 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f   addr into OP_No
7c00: 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  op.*/.int sqlite
7c10: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
7c20: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
7c30: 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  ddr){.  VdbeOp *
7c40: 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  pOp;.  if( p->db
7c50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7c60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
7c70: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 20  ert( addr>=0 && 
7c80: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
7c90: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
7ca0: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 70  ddr];.  freeP4(p
7cb0: 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  ->db, pOp->p4typ
7cc0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
7cd0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
7ce0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f 70  4_NOTUSED;.  pOp
7cf0: 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.z = 0;.  pO
7d00: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
7d10: 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  oop;.  return 1;
7d20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
7d30: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20   last opcode is 
7d40: 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e  "op" and it is n
7d50: 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ot a jump destin
7d60: 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72  ation,.** then r
7d70: 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72  emove it.  Retur
7d80: 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e  n true if and on
7d90: 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20  ly if an opcode 
7da0: 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  was removed..*/.
7db0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44  int sqlite3VdbeD
7dc0: 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65  eletePriorOpcode
7dd0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29  (Vdbe *p, u8 op)
7de0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  {.  if( p->nOp>0
7df0: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
7e00: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
7e10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
7e20: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
7e30: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
7e40: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
7e50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
7e60: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
7e70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7e80: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
7e90: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
7ea0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
7eb0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
7ec0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
7ed0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
7ee0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
7ef0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
7f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
7f10: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
7f20: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
7f30: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
7f40: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
7f50: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
7f60: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
7f70: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
7f80: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
7f90: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
7fa0: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
7fb0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
7fc0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
7fd0: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
7fe0: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
7ff0: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
8000: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
8010: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
8020: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
8030: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
8040: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
8050: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
8060: 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54  es of n (P4_STAT
8070: 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65  IC, P4_COLLSEQ e
8080: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
8090: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a  at zP4 points.**
80a0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
80b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
80c0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
80d0: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
80e0: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
80f0: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
8100: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
8110: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
8120: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
8130: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
8140: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8150: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
8160: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
8170: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
8180: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62  ITE_NOINLINE vdb
8190: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20  eChangeP4Full(. 
81a0: 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a   Vdbe *p,.  Op *
81b0: 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  pOp,.  const cha
81c0: 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a  r *zP4,.  int n.
81d0: 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  ){.  if( pOp->p4
81e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65  type ){.    free
81f0: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
8200: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
8210: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
8220: 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  pe = 0;.    pOp-
8230: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20  >p4.p = 0;.  }. 
8240: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
8250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8260: 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70  eP4(p, (int)(pOp
8270: 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c   - p->aOp), zP4,
8280: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
8290: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
82a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
82b0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
82c0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
82d0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
82e0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
82f0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
8300: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  AMIC;.  }.}.void
8310: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8320: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
8330: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
8340: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
8350: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
8360: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
8370: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
8380: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
8390: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
83a0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
83b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
83c0: 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op!=0 || db->mal
83d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
83e0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
83f0: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  led ){.    if( n
8400: 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65  !=P4_VTAB ) free
8410: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
8420: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
8430: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8440: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
8450: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
8460: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
8470: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
8480: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
8490: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
84a0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
84b0: 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20  ;.  if( n>=0 || 
84c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
84d0: 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46     vdbeChangeP4F
84e0: 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c  ull(p, pOp, zP4,
84f0: 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   n);.    return;
8500: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34  .  }.  if( n==P4
8510: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
8520: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
8530: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
8540: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
8550: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
8560: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
8570: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
8580: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
8590: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
85a0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
85b0: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
85c0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
85d0: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
85e0: 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  zP4!=0 ){.    as
85f0: 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20  sert( n<0 );.   
8600: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
8610: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
8620: 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e  ->p4type = (sign
8630: 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69  ed char)n;.    i
8640: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20  f( n==P4_VTAB ) 
8650: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
8660: 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20  (VTable*)zP4);. 
8670: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8680: 67 65 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  ge the P4 operan
8690: 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
86a0: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
86b0: 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f 20  truction .** to 
86c0: 74 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e 65  the value define
86d0: 64 20 62 79 20 74 68 65 20 61 72 67 75 6d 65 6e  d by the argumen
86e0: 74 73 2e 20 20 54 68 69 73 20 69 73 20 61 20 68  ts.  This is a h
86f0: 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 72  igh-speed.** ver
8700: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
8710: 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a 2a  dbeChangeP4()..*
8720: 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 72  *.** The P4 oper
8730: 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 76  and must not hav
8740: 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  e been previousl
8750: 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 20  y defined.  And 
8760: 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d 75  the new.** P4 mu
8770: 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e 54  st not be P4_INT
8780: 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65 33  32.  Use sqlite3
8790: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 69  VdbeChangeP4() i
87a0: 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 74  n either of.** t
87b0: 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a 76  hose cases..*/.v
87c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
87d0: 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70 2c  ppendP4(Vdbe *p,
87e0: 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 20   void *pP4, int 
87f0: 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  n){.  VdbeOp *pO
8800: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d  p;.  assert( n!=
8810: 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d 50  P4_INT32 && n!=P
8820: 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 65  4_VTAB );.  asse
8830: 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 66  rt( n<=0 );.  if
8840: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
8850: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 65  ailed ){.    fre
8860: 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 50  eP4(p->db, n, pP
8870: 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
8880: 20 61 73 73 65 72 74 28 20 70 50 34 21 3d 30 20   assert( pP4!=0 
8890: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
88a0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
88b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  Op = &p->aOp[p->
88c0: 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  nOp-1];.    asse
88d0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
88e0: 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a 20  =P4_NOTUSED );. 
88f0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
8900: 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   n;.    pOp->p4.
8910: 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a 0a  p = pP4;.  }.}..
8920: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34  /*.** Set the P4
8930: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
8940: 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f  ently added opco
8950: 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66  de to the KeyInf
8960: 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64  o for the.** ind
8970: 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  ex given..*/.voi
8980: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
8990: 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20  P4KeyInfo(Parse 
89a0: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
89b0: 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76  pIdx){.  Vdbe *v
89c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
89d0: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
89e0: 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28  yInfo;.  assert(
89f0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
8a00: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
8a10: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
8a20: 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
8a30: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
8a40: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
8a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
8a60: 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f  ndP4(v, pKeyInfo
8a70: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d  , P4_KEYINFO);.}
8a80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8a90: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8aa0: 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68  OMMENTS./*.** Ch
8ab0: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
8ac0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
8ad0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
8ae0: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
8af0: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
8b00: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
8b10: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
8b20: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
8b30: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
8b40: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
8b50: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
8b60: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
8b70: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
8b80: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
8b90: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
8ba0: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
8bb0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
8bc0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
8bd0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
8be0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
8bf0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
8c00: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
8c10: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
8c20: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
8c30: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
8c40: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
8c50: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
8c60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
8c70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
8c80: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
8c90: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
8ca0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
8cb0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
8cc0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
8cd0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
8ce0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
8cf0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
8d00: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
8d10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
8d20: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
8d30: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
8d40: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
8d50: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
8d60: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
8d70: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
8d80: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
8d90: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
8da0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
8db0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
8dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
8dd0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
8de0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
8df0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
8e00: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
8e10: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
8e20: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
8e30: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
8e40: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
8e50: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
8e60: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
8e70: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
8e80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
8e90: 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a  BE_COVERAGE./*.*
8ea0: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
8eb0: 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20  if the iSrcLine 
8ec0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72  field for the pr
8ed0: 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69  eviously coded i
8ee0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
8ef0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8f00: 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62  etLineNumber(Vdb
8f10: 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29  e *v, int iLine)
8f20: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
8f30: 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63  etOp(v,-1)->iSrc
8f40: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a  Line = iLine;.}.
8f50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8f60: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a  _VDBE_COVERAGE *
8f70: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
8f80: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
8f90: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
8fa0: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
8fb0: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
8fc0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
8fd0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
8fe0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
8ff0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9000: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
9010: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
9020: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
9030: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
9040: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
9050: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
9060: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
9070: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
9080: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
9090: 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c   but not writabl
90a0: 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  e, though it is 
90b0: 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62  cast to a writab
90c0: 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  le value..** The
90d0: 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d   return of a dum
90e0: 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  my opcode allows
90f0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
9100: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
9110: 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f  g.** after an OO
9120: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
9130: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
9140: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
9150: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
9160: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
9170: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
9180: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
9190: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
91a0: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
91b0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
91c0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
91d0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
91e0: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
91f0: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
9200: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56  h Valgrind..*/.V
9210: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
9220: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
9230: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
9240: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
9250: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
9260: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
9270: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
9280: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
9290: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
92a0: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
92b0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
92c0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
92d0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
92e0: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
92f0: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
9300: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
9310: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
9320: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
9330: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
9340: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
9350: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
9360: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
9370: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
9380: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
9390: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
93a0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
93b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
93c0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
93d0: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
93e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
93f0: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
9400: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  r];.  }.}..#if d
9410: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9420: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
9430: 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74  MENTS)./*.** Ret
9440: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
9450: 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  alue for one of 
9460: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  the parameters t
9470: 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70  o the opcode pOp
9480: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
9490: 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a  y character c..*
94a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
94b0: 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20  nslateP(char c, 
94c0: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a  const Op *pOp){.
94d0: 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72    if( c=='1' ) r
94e0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20  eturn pOp->p1;. 
94f0: 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65   if( c=='2' ) re
9500: 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  turn pOp->p2;.  
9510: 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74  if( c=='3' ) ret
9520: 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  urn pOp->p3;.  i
9530: 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75  f( c=='4' ) retu
9540: 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  rn pOp->p4.i;.  
9550: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a  return pOp->p5;.
9560: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
9570: 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68   a string for th
9580: 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c  e "comment" fiel
9590: 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f  d of a VDBE opco
95a0: 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  de listing..**.*
95b0: 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20  * The Synopsis: 
95c0: 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74  field in comment
95d0: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
95e0: 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73  source file gets
95f0: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
9600: 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67   an extra string
9610: 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65   that is appende
9620: 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
9630: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49  OpcodeName().  I
9640: 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65  n the.** absence
9650: 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e   of other commen
9660: 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69  ts, this synopsi
9670: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  s becomes the co
9680: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63  mment on the opc
9690: 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61  ode..** Some tra
96a0: 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a  nslation occurs:
96b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  .**.**       "PX
96c0: 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d  "      ->  "r[X]
96d0: 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  ".**       "PX@P
96e0: 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y"   ->  "r[X..X
96f0: 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d  +Y-1]"  or "r[x]
9700: 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31  " if y is 0 or 1
9710: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
9720: 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  +1" ->  "r[X..X+
9730: 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  Y]"    or "r[x]"
9740: 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20   if y is 0.**   
9750: 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e      "PY..PY"  ->
9760: 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20    "r[X..Y]"     
9770: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c   or "r[x]" if y<
9780: 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  =x.*/.static int
9790: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
97a0: 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  .  const Op *pOp
97b0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63  ,     /* The opc
97c0: 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e  ode to be commen
97d0: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
97e0: 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50  har *zP4,   /* P
97f0: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
9800: 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20  ed value for P4 
9810: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
9820: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
9830: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
9840: 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20    int nTemp     
9850: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76       /* Space av
9860: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70  ailable in zTemp
9870: 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  [] */.){.  const
9880: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
9890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
98a0: 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e  ynopsis;.  int n
98b0: 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69  OpName;.  int ii
98c0: 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c  , jj;.  char zAl
98d0: 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65  t[50];.  zOpName
98e0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
98f0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
9900: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
9910: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9920: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
9930: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
9940: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
9950: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
9960: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
9970: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
9980: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
9990: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
99a0: 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29  ynopsis,"IF ",3)
99b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
99c0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
99d0: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
99e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
99f0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c  rintf(sizeof(zAl
9a00: 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 5d  t), zAlt, "r[P2]
9a10: 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70   = (%s)", zSynop
9a20: 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65  sis+3);.      }e
9a30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
9a40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9a50: 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74  zeof(zAlt), zAlt
9a60: 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32  , "if %s goto P2
9a70: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
9a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
9a90: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b  Synopsis = zAlt;
9aa0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
9ab0: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
9ac0: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
9ad0: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
9ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
9af0: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
9b00: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
9b10: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
9b20: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
9b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9b40: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
9b50: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
9b60: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
9b70: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
9b80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
9b90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9ba0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
9bb0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
9bc0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
9bd0: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
9be0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9bf0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
9c00: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
9c10: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
9c20: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
9c30: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9c40: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
9c50: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
9c60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
9c70: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
9c80: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
9c90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9ca0: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
9cb0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
9cc0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
9cd0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
9ce0: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
9cf0: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
9d00: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
9d10: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
9d20: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
9d30: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
9d50: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
9d60: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
9d70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9d80: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
9da0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9db0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
9dc0: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
9dd0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
9de0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
9df0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
9e00: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
9e10: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
9e20: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
9e30: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
9e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e60: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
9e70: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
9e80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9e90: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
9ea0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
9eb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
9ec0: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
9ed0: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
9ee0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
9ef0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9f00: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
9f10: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
9f20: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
9f30: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
9f40: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
9f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9f60: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
9f70: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
9f80: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
9f90: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
9fa0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9fb0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
9fc0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
9fd0: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
9fe0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
9ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
a000: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
a010: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
a020: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
a030: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
a040: 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44  G */..#if VDBE_D
a050: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
a060: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
a070: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
a080: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
a090: 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61   the P4.pExpr va
a0a0: 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75  lue for an OP_Cu
a0b0: 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20  rsorHint opcode 
a0c0: 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61  into text.** tha
a0d0: 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79  t can be display
a0e0: 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c  ed in the P4 col
a0f0: 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f  umn of EXPLAIN o
a100: 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  utput..*/.static
a110: 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45   void displayP4E
a120: 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c  xpr(StrAccum *p,
a130: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
a140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
a150: 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20   = 0;.  switch( 
a160: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
a170: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
a180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a190: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
a1a0: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
a1b0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
a1c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
a1d0: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
a1e0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a1f0: 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72  f(p, "%d", pExpr
a200: 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
a210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a220: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
a230: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a240: 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c 22 29  pendf(p, "NULL")
a250: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a260: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
a270: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
a280: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
a290: 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78  (p, "r[%d]", pEx
a2a0: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
a2b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a2c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
a2d0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
a2e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
a2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a300: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a310: 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20  p, "rowid");.   
a320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a330: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a340: 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22 2c 20  pendf(p, "c%d", 
a350: 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c  (int)pExpr->iCol
a360: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  umn);.      }.  
a370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a380: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
a390: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22        zOp = "LT"
a3a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a3b0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
a3c0: 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20     zOp = "LE";  
a3d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a3e0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
a3f0: 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  zOp = "GT";     
a400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a410: 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70   TK_GE:      zOp
a420: 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 72   = "GE";      br
a430: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a440: 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _NE:      zOp = 
a450: 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "NE";      break
a460: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
a470: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51  :      zOp = "EQ
a480: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a490: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20     case TK_IS:  
a4a0: 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20      zOp = "IS"; 
a4b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a4c0: 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20  case TK_ISNOT:  
a4d0: 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20   zOp = "ISNOT"; 
a4e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a4f0: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f  e TK_AND:     zO
a500: 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62  p = "AND";     b
a510: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a520: 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_OR:      zOp =
a530: 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61   "OR";      brea
a540: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
a550: 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41  LUS:    zOp = "A
a560: 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  DD";     break;.
a570: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
a580: 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22  :    zOp = "MUL"
a590: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a5a0: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
a5b0: 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20    zOp = "SUB";  
a5c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a5d0: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
a5e0: 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20  Op = "REM";     
a5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a600: 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20  TK_BITAND:  zOp 
a610: 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65  = "BITAND";  bre
a620: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a630: 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22  BITOR:   zOp = "
a640: 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b  BITOR";   break;
a650: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
a660: 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56  SH:   zOp = "DIV
a670: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a680: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
a690: 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54  :  zOp = "LSHIFT
a6a0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
a6b0: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
a6c0: 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  zOp = "RSHIFT"; 
a6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a6e0: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70   TK_CONCAT:  zOp
a6f0: 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72   = "CONCAT";  br
a700: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a710: 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20  _UMINUS:  zOp = 
a720: 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b  "MINUS";   break
a730: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  ;.    case TK_UP
a740: 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c  LUS:   zOp = "PL
a750: 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  US";    break;. 
a760: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
a770: 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f  T:  zOp = "BITNO
a780: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
a790: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20  case TK_NOT:    
a7a0: 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20   zOp = "NOT";   
a7b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a7c0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f  e TK_ISNULL:  zO
a7d0: 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62  p = "ISNULL";  b
a7e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a7f0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d  K_NOTNULL: zOp =
a800: 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61   "NOTNULL"; brea
a810: 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  k;..    default:
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a830: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
a840: 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20  s", "expr");.   
a850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
a860: 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20   if( zOp ){.    
a870: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a880: 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f  ndf(p, "%s(", zO
a890: 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50  p);.    displayP
a8a0: 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e  4Expr(p, pExpr->
a8b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
a8c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
a8d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a8e0: 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 2c 22  tr_append(p, ","
a8f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73 70  , 1);.      disp
a900: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
a910: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
a920: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
a930: 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 29 22  tr_append(p, ")"
a940: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
a950: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
a960: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
a970: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
a980: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
a990: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
a9a0: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
a9b0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
a9c0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
a9d0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
a9e0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
a9f0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
aa00: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
aa10: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
aa20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
aa30: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
aa40: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
aa50: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
aa60: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
aa70: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
aa80: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
aa90: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
aaa0: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
aab0: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
aac0: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
aad0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
aae0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
aaf0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
ab00: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
ab10: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
ab20: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
ab30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
ab40: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
ab50: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
ab60: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
ab70: 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70  df(&x, "k(%d", p
ab80: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
ab90: 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ld);.      for(j
aba0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
abb0: 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  nKeyField; j++){
abc0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
abd0: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
abe0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
abf0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
ac00: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
ac10: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
ac20: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28   "";.        if(
ac30: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22   strcmp(zColl, "
ac40: 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43  BINARY")==0 ) zC
ac50: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
ac60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
ac70: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 73 25  ppendf(&x, ",%s%
ac80: 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  s", .           
ac90: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
aca0: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d  ortOrder[j] ? "-
acb0: 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a  " : "", zColl);.
acc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
acd0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ace0: 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  (&x, ")", 1);.  
acf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ad00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ad10: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
ad20: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
ad30: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73  XPR: {.      dis
ad40: 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 70  playP4Expr(&x, p
ad50: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
ad60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad70: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
ad80: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
ad90: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
ada0: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
adb0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
adc0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
add0: 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70  &x, "(%.20s)", p
ade0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
adf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ae00: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
ae10: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
ae20: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
ae30: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20  p->p4.pFunc;.   
ae40: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
ae50: 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 28 25  ppendf(&x, "%s(%
ae60: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
ae70: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
ae80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ae90: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  }.#if defined(SQ
aea0: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
aeb0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
aec0: 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 34  ILE).    case P4
aed0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
aee0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
aef0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e  = pOp->p4.pCtx->
af00: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
af10: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
af20: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70  (&x, "%s(%d)", p
af30: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
af40: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
af50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
af60: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
af70: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
af80: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
af90: 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  f(&x, "%lld", *p
afa0: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
afb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
afc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
afd0: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
afe0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
aff0: 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  &x, "%d", pOp->p
b000: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
b010: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b020: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
b030: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b040: 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31 36  ppendf(&x, "%.16
b050: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
b060: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
b070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b080: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
b090: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
b0a0: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
b0b0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
b0c0: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
b0d0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
b0e0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
b0f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
b100: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b120: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b130: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
b140: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b150: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b160: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
b170: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b180: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31  appendf(&x, "%.1
b190: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
b1a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b1b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
b1c0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
b1d0: 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b     zP4 = "NULL";
b1e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b1f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
b200: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b210: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
b220: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
b230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b240: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b250: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b260: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
b270: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
b280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
b290: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
b2a0: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
b2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b2c0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b2d0: 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62  "vtab:%p", pVtab
b2e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b2f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b300: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
b310: 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y: {.      int i
b320: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20  ;.      int *ai 
b330: 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20  = pOp->p4.ai;.  
b340: 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30      int n = ai[0
b350: 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  ];   /* The firs
b360: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20  t element of an 
b370: 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77 61  INTARRAY is alwa
b380: 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ys the.         
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
b3a0: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
b3b0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
b3c0: 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
b3d0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
b3e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
b3f0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b400: 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22 2c 20  endf(&x, ",%d", 
b410: 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ai[i]);.      }.
b420: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
b430: 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69   '[';.      sqli
b440: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
b450: 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20  x, "]", 1);.    
b460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b470: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
b480: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
b490: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b4a0: 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22  df(&x, "program"
b4b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b4c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b4d0: 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63  4_DYNBLOB:.    c
b4e0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
b4f0: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
b500: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
b510: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b520: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
b530: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b540: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 22  appendf(&x, "%s"
b550: 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e  , pOp->p4.pTab->
b560: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
b570: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b580: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b590: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
b5a0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
b5b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
b5c0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
b5d0: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
b5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b5f0: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
b600: 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20  cumFinish(&x);. 
b610: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
b620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
b630: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
b640: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a  E_DISPLAY_P4 */.
b650: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
b660: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
b670: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
b680: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
b690: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
b6a0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
b6b0: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
b6c0: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
b6d0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
b6e0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
b6f0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
b700: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
b710: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
b720: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
b730: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
b740: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
b750: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
b760: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
b770: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
b780: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
b790: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
b7a0: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
b7b0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
b7c0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
b7d0: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
b7e0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
b7f0: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
b800: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
b810: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
b820: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
b830: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44  eeMask)*8 );.  D
b840: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65  bMaskSet(p->btre
b850: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28  eMask, i);.  if(
b860: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
b870: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
b880: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
b890: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
b8a0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69  t(p->lockMask, i
b8b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  );.  }.}..#if !d
b8c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b8d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
b8e0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
b8f0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
b900: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
b910: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
b920: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
b930: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
b940: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
b950: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
b960: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
b970: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
b980: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
b990: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
b9a0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
b9b0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
b9c0: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
b9d0: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
b9e0: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
b9f0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
ba00: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
ba10: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
ba20: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
ba30: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
ba40: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
ba50: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
ba60: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
ba70: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
ba80: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
ba90: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
baa0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
bab0: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
bac0: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
bad0: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
bae0: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
baf0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
bb00: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
bb10: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
bb20: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
bb30: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
bb40: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
bb50: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
bb60: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
bb70: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
bb80: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
bb90: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
bba0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
bbb0: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
bbc0: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
bbd0: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
bbe0: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
bbf0: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
bc00: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
bc10: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
bc20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
bc30: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
bc40: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
bc50: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
bc60: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
bc70: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
bc80: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
bc90: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
bca0: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
bcb0: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
bcc0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
bcd0: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
bce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bcf0: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
bd00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
bd10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
bd20: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
bd30: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
bd40: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
bd50: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
bd60: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
bd70: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
bd80: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
bd90: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
bda0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
bdb0: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
bdc0: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
bdd0: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
bde0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
bdf0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
be00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
be10: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
be20: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
be30: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
be40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
be50: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
be60: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
be70: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
be80: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
be90: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
bea0: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
beb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
bec0: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74  beEnter()..*/.st
bed0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
bee0: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65  LINE void vdbeLe
bef0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
bf00: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
bf10: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
bf20: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62  .  int nDb;.  db
bf30: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
bf40: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
bf50: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
bf60: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
bf70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
bf80: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
bf90: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
bfa0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
bfb0: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
bfc0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
bfd0: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
bfe0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
bff0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
c000: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
c010: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
c020: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
c030: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
c040: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76  mmon case */.  v
c050: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23  dbeLeave(p);.}.#
c060: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
c070: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
c080: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
c090: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
c0a0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
c0b0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
c0c0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
c0d0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c0e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c0f0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
c100: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
c110: 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  VdbeOp *pOp){.  
c120: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
c130: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
c140: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
c150: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c160: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
c170: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
c180: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
c190: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
c1a0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
c1b0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
c1c0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
c1d0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
c1e0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c1f0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
c200: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
c210: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
c220: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
c230: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
c240: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
c250: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
c260: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
c270: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
c280: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
c290: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
c2a0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
c2b0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
c2c0: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
c2d0: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
c2e0: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
c2f0: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
c300: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
c310: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
c320: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
c330: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
c340: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
c350: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
c360: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
c370: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
c380: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
c390: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
c3a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c3b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
c3c0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
c3d0: 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  lement..*/.stati
c3e0: 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72  c void initMemAr
c3f0: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
c400: 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  N, sqlite3 *db, 
c410: 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77 68  u16 flags){.  wh
c420: 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a  ile( (N--)>0 ){.
c430: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
c440: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66      p->flags = f
c450: 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d  lags;.    p->szM
c460: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65  alloc = 0;.#ifde
c470: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c480: 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d     p->pScopyFrom
c490: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
c4a0: 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   p++;.  }.}../*.
c4b0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
c4c0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
c4d0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
c4e0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
c4f0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
c500: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
c510: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
c520: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
c530: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c540: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  >db;.    if( db-
c550: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
c560: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
c570: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
c580: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
c590: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
c5a0: 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  c);.      }while
c5b0: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
c5c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c5d0: 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
c5e0: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
c5f0: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
c600: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20  db==p[1].db );. 
c610: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
c620: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
c630: 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b  Invariants(p) );
c640: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
c650: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
c660: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
c670: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
c680: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
c690: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
c6a0: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
c6b0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
c6c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
c6d0: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
c6e0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
c6f0: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
c700: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
c710: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
c720: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
c730: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
c740: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
c750: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
c760: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
c770: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
c780: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
c790: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
c7a0: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
c7b0: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
c7c0: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
c7d0: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
c7e0: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
c7f0: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
c800: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
c810: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
c820: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
c830: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
c840: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
c850: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
c860: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
c870: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
c880: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
c890: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
c8a0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
c8b0: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
c8c0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
c8d0: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
c8e0: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
c8f0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
c900: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
c910: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c920: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
c930: 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a  gs & MEM_Agg );.
c940: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
c950: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  p->flags & MEM_D
c960: 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  yn );.      test
c970: 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d 3d 73  case( p->xDel==s
c980: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d  qlite3VdbeFrameM
c990: 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 69  emDel );.      i
c9a0: 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  f( p->flags&(MEM
c9b0: 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b  _Agg|MEM_Dyn) ){
c9c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c9d0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
c9e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
c9f0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
ca00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ca10: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
ca20: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
ca30: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
ca40: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
ca50: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
ca60: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
ca70: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
ca80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  End );.  }.}..#i
ca90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
caa0: 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  G./*.** Verify t
cab0: 68 61 74 20 70 46 72 61 6d 65 20 69 73 20 61 20  hat pFrame is a 
cac0: 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d 65 20  valid VdbeFrame 
cad0: 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75 72 6e  pointer.  Return
cae0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 0a 2a   true if it is.*
caf0: 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 73  * and false if s
cb00: 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72 6f 6e  omething is wron
cb10: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
cb20: 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65  utine is intende
cb30: 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65  d for use inside
cb40: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
cb50: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f  tements only..*/
cb60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
cb70: 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56 64 62  FrameIsValid(Vdb
cb80: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
cb90: 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d 3e 69  .  if( pFrame->i
cba0: 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51 4c 49  FrameMagic!=SQLI
cbb0: 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43 20 29  TE_FRAME_MAGIC )
cbc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
cbd0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
cbe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
cbf0: 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 20  a destructor on 
cc00: 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28 77 68  a Mem object (wh
cc10: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ich is really an
cc20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 29 0a   sqlite3_value).
cc30: 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65 73 20  ** that deletes 
cc40: 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65 63 74  the Frame object
cc50: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
cc60: 64 20 74 6f 20 69 74 20 61 73 20 61 20 62 6c 6f  d to it as a blo
cc70: 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
cc80: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64  utine does not d
cc90: 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d 65 20  elete the Frame 
cca0: 72 69 67 68 74 20 61 77 61 79 2e 20 20 49 74 20  right away.  It 
ccb0: 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68 65 0a  merely adds the.
ccc0: 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20 6c 69  ** frame to a li
ccd0: 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
cce0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
ccf0: 74 68 65 20 56 64 62 65 20 68 61 6c 74 73 2e 0a  the Vdbe halts..
cd00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
cd10: 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 28 76  dbeFrameMemDel(v
cd20: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 56 64  oid *pArg){.  Vd
cd30: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
cd40: 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29 70 41  = (VdbeFrame*)pA
cd50: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rg;.  assert( sq
cd60: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 73  lite3VdbeFrameIs
cd70: 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20 29 3b  Valid(pFrame) );
cd80: 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  .  pFrame->pPare
cd90: 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76 2d 3e  nt = pFrame->v->
cda0: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70 46 72  pDelFrame;.  pFr
cdb0: 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d  ame->v->pDelFram
cdc0: 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a  e = pFrame;.}...
cdd0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56  /*.** Delete a V
cde0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20  dbeFrame object 
cdf0: 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  and its contents
ce00: 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  . VdbeFrame obje
ce10: 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  cts are.** alloc
ce20: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50  ated by the OP_P
ce30: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
ce40: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
ce50: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
ce60: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
ce70: 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29  te(VdbeFrame *p)
ce80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
ce90: 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61   *aMem = VdbeFra
cea0: 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65  meMem(p);.  Vdbe
ceb0: 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d  Cursor **apCsr =
cec0: 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29   (VdbeCursor **)
ced0: 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d  &aMem[p->nChildM
cee0: 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  em];.  assert( s
cef0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
cf00: 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20 20 66  sValid(p) );.  f
cf10: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
cf20: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
cf30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
cf40: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
cf50: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
cf60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
cf70: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
cf80: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
cf90: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
cfa0: 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  ->v->db, &p->pAu
cfb0: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
cfc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
cfd0: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
cfe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cff0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
d000: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
d010: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
d020: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
d030: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
d040: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
d050: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
d060: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
d070: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
d080: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
d090: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
d0a0: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
d0b0: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
d0c0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
d0d0: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
d0e0: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
d0f0: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
d100: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
d110: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
d120: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
d130: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
d140: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
d150: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
d160: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
d170: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
d180: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
d190: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
d1a0: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
d1b0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
d1c0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
d1d0: 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30 34 2d  LAN..** 2018-04-
d1e0: 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70 6c 61  24:  In p->expla
d1f0: 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68 65 20  in==2 mode, the 
d200: 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 73 20  OP_Init opcodes 
d210: 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 61  of triggers.** a
d220: 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c 20 73  re also shown, s
d230: 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e 64  o that the bound
d240: 61 72 69 65 73 20 62 65 74 77 65 65 6e 20 74 68  aries between th
d250: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
d260: 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69 67 67  nd.** each trigg
d270: 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a 2a 2a  er are clear..**
d280: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
d290: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
d2a0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
d2b0: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
d2c0: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
d2d0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
d2e0: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
d2f0: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
d300: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
d310: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d330: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
d340: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
d370: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
d380: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
d390: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d3c0: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
d3d0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
d3e0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
d3f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d400: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
d410: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
d420: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d440: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
d450: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
d460: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
d470: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d4a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d4b0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d4e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
d4f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d520: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
d530: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
d540: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
d550: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
d560: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 69  set */.  int bLi
d570: 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28 70 2d  stSubprogs = (p-
d580: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28  >explain==1 || (
d590: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d5a0: 54 45 5f 54 72 69 67 67 65 72 45 51 50 29 21 3d  TE_TriggerEQP)!=
d5b0: 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20  0);.  Op *pOp = 
d5c0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
d5d0: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
d5e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
d5f0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
d600: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
d610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
d620: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
d630: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
d640: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
d650: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
d660: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
d670: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
d680: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
d690: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
d6a0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
d6b0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
d6c0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
d6d0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
d6e0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
d6f0: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
d700: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
d710: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
d720: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d730: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
d740: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
d750: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d760: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
d770: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
d780: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
d790: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
d7a0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
d7b0: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
d7c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
d7d0: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
d7e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
d7f0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
d800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
d810: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
d820: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
d830: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
d840: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
d850: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
d860: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
d870: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
d880: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
d890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
d8a0: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
d8b0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
d8c0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
d8d0: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
d8e0: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
d8f0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
d900: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
d910: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
d920: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
d930: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
d940: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
d950: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
d960: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
d970: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
d980: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
d990: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
d9a0: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
d9b0: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
d9c0: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
d9d0: 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70  .  if( bListSubp
d9e0: 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rogs ){.    /* T
d9f0: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
da00: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
da10: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
da20: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
da30: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
da40: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
da50: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
da60: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
da70: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
da80: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
da90: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
daa0: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
dab0: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
dac0: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
dad0: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
dae0: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
daf0: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
db00: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
db10: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
db20: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
db30: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
db40: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
db50: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
db60: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
db70: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
db80: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
db90: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
dba0: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
dbb0: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
dbc0: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
dbd0: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
dbe0: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
dbf0: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
dc00: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
dc10: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
dc20: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
dc30: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
dc40: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
dc50: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b    }..  while(1){
dc60: 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74 73 20    /* Loop exits 
dc70: 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20 20  via break */.   
dc80: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
dc90: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
dca0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
dcb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
dcc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
dcd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
dce0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
dcf0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
dd00: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
dd10: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
dd20: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
dd30: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
dd40: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
dd50: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
dd60: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
dd70: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
dd80: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
dd90: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
dda0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
ddb0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
ddc0: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
ddd0: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
dde0: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
ddf0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
de00: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
de10: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
de20: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
de30: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
de40: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
de50: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
de60: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
de70: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
de80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e    }..    /* When
de90: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
dea0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
deb0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
dec0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
ded0: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
dee0: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
def0: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
df00: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
df10: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 2a  ubprograms.    *
df20: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
df30: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
df40: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
df50: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
df60: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 2a 2a  ubprogram.    **
df70: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
df80: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
df90: 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69 73 74  */.    if( bList
dfa0: 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f 70 2d  Subprogs && pOp-
dfb0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
dfc0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
dfd0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
dfe0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
dff0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
e000: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
e010: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
e020: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e030: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
e040: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
e050: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e060: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 29 7b    if( j==nSub ){
e070: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
e080: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
e090: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
e0a0: 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20 20 20   nSub!=0);.     
e0b0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
e0c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e0d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e0e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e0f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e100: 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53 75 62   }.        apSub
e110: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
e120: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
e130: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
e140: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
e150: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70 53 75  ram;.        pSu
e160: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
e170: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 53  Blob;.        pS
e180: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
e190: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
e1a0: 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
e1b0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
e1c0: 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  am->nOp;.      }
e1d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e1e0: 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20 62 72  ->explain<2 ) br
e1f0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  eak;.    if( pOp
e200: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70  ->opcode==OP_Exp
e210: 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  lain ) break;.  
e220: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e230: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 2d  e==OP_Init && p-
e240: 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  >pc>1 ) break;. 
e250: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
e260: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
e270: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
e280: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 20  rrupted ){.     
e290: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e2a0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20  INTERRUPT;.     
e2b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e2c0: 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
e2d0: 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71  3VdbeError(p, sq
e2e0: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
e2f0: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
e300: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b        char *zP4;
e310: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78  .      if( p->ex
e320: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
e330: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e340: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e350: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
e360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
e390: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
e3a0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 20  Mem++;.    .    
e3b0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e3c0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
e3d0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
e3e0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
e3f0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
e400: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
e410: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
e420: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
e430: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
e440: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
e450: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
e460: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
e470: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
e480: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
e490: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
e4a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
e4b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e4c0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
e4d0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
e500: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
e510: 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ..      pMem->fl
e520: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e530: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e540: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
e570: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
e580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e590: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
e5a0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
e5b0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e5d0: 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  3 */.      pMem+
e5e0: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  +;..      if( sq
e5f0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
e600: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
e610: 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a   100) ){ /* P4 *
e620: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
e630: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
e640: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
e650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
e660: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
e670: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e680: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
e690: 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  rm;.      zP4 = 
e6a0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
e6b0: 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a  Mem->z, pMem->sz
e6c0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  Malloc);.      i
e6d0: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
e6e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
e6f0: 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
e700: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
e710: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
e720: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
e730: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
e740: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
e750: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
e760: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
e770: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e780: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
e790: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
e7a0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
e7b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2b     }.      pMem+
e7c0: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +;..      if( p-
e7d0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
e7e0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
e7f0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
e800: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
e810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
e820: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
e830: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
e840: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e850: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e860: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d      }.        pM
e870: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e880: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
e890: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
e8a0: 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  2;.        sqlit
e8b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
e8c0: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
e8d0: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
e8e0: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65  5 */.        pMe
e8f0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
e900: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
e910: 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64 65  em++;.    .#ifde
e920: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e930: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
e940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
e950: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
e960: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
e970: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  500) ){.        
e980: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
e990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e9a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
e9b0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
e9c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e9d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e9e0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
e9f0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ea00: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
ea10: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
ea20: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
ea30: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ea40: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
ea50: 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  se.        pMem-
ea60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
ea70: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ea80: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
ea90: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
eaa0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
eab0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
eac0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
ead0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 73  );.      p->pRes
eae0: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
eaf0: 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 72  m[1];.      p->r
eb00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
eb10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
eb20: 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _ROW;.    }.  }.
eb30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
eb40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
eb50: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
eb60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
eb70: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
eb80: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
eb90: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
eba0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
ebb0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
ebc0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
ebd0: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
ebe0: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
ebf0: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
ec00: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
ec10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
ec20: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
ec30: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
ec40: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
ec50: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
ec60: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
ec70: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
ec80: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
ec90: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
eca0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
ecb0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
ecc0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
ecd0: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
ece0: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
ecf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ed00: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
ed10: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ed20: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
ed30: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
ed40: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
ed50: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
ed60: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
ed70: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
ed80: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
ed90: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
eda0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
edb0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
edc0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
edd0: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
ede0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
edf0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
ee00: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
ee10: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
ee20: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
ee30: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
ee40: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
ee50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ee60: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
ee70: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
ee80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
ee90: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
eea0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
eeb0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
eec0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
eed0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
eee0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
eef0: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
ef00: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
ef10: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
ef20: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
ef30: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
ef40: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
ef50: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
ef60: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
ef70: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
ef80: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
ef90: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
efa0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
efb0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
efc0: 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  E */../* An inst
efd0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
efe0: 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75  ect describes bu
eff0: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
f000: 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62  ble for use.** b
f010: 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20  y subcomponents 
f020: 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74  of a prepared st
f030: 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20  atement.  Space 
f040: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74  is allocated out
f050: 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c  .** of a Reusabl
f060: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79  eSpace object by
f070: 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28   the allocSpace(
f080: 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e  ) routine below.
f090: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61  .*/.struct Reusa
f0a0: 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20  bleSpace {.  u8 
f0b0: 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
f0c0: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d    /* Available m
f0d0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
f0e0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
f0f0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69  /* Bytes of avai
f100: 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  lable memory */.
f110: 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20    int nNeeded;  
f120: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
f130: 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64  bytes that could
f140: 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
f150: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20  d */.};../* Try 
f160: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74  to allocate nByt
f170: 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74  e bytes of 8-byt
f180: 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d  e aligned bulk m
f190: 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a  emory for pBuf.*
f1a0: 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61  * from the Reusa
f1b0: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e  bleSpace object.
f1c0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
f1d0: 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
f1e0: 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e  ted.** memory on
f1f0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e   success.  If in
f200: 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72  sufficient memor
f210: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  y is available i
f220: 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c  n the.** Reusabl
f230: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69  eSpace object, i
f240: 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73  ncrease the Reus
f250: 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65  ableSpace.nNeede
f260: 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68  d.** value by th
f270: 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20  e amount needed 
f280: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
f290: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69  .**.** If pBuf i
f2a0: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20  s not initially 
f2b0: 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73  NULL, that means
f2c0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
f2d0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
f2e0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  been allocated b
f2f0: 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  y a prior call t
f300: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  o this routine, 
f310: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  so just return a
f320: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66   copy.** of pBuf
f330: 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61   and leave Reusa
f340: 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67  bleSpace unchang
f350: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61  ed..**.** This a
f360: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c  llocator is empl
f370: 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73  oyed to repurpos
f380: 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61  e unused slots a
f390: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
f3a0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79  .** opcode array
f3b0: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61   of prepared sta
f3c0: 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d  te for other mem
f3d0: 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65  ory needs of the
f3e0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
f3f0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
f400: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
f410: 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75  ce(.  struct Reu
f420: 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20  sableSpace *p,  
f430: 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61  /* Bulk memory a
f440: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
f450: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  ocation */.  voi
f460: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
f470: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f480: 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c  r to a prior all
f490: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ocation */.  int
f4a0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
f4b0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
f4c0: 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64  of memory needed
f4d0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
f4e0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
f4f0: 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29  NMENT(p->pSpace)
f500: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d   );.  if( pBuf==
f510: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
f520: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
f530: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d      if( nByte <=
f540: 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20   p->nFree ){.   
f550: 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e     p->nFree -= n
f560: 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66  Byte;.      pBuf
f570: 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d   = &p->pSpace[p-
f580: 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c  >nFree];.    }el
f590: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65  se{.      p->nNe
f5a0: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  eded += nByte;. 
f5b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
f5c0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
f5d0: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b  IGNMENT(pBuf) );
f5e0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
f5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
f600: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
f610: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
f620: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
f630: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
f640: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f650: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
f660: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
f670: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
f680: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
f690: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
f6a0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
f6b0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
f6c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
f6d0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c  BE_MAGIC_INIT ||
f6e0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
f6f0: 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a  MAGIC_RESET );..
f700: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
f710: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
f720: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
f730: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
f740: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
f750: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
f760: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
f770: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
f780: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
f790: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
f7a0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
f7b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
f7c0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
f7d0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
f7e0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
f7f0: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
f800: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
f810: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
f820: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
f830: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
f840: 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  ort;.  p->nChang
f850: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
f860: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
f870: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
f880: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
f890: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
f8a0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
f8b0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42   = 0;.#ifdef VDB
f8c0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28  E_PROFILE.  for(
f8d0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
f8e0: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  ++){.    p->aOp[
f8f0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
f900: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
f910: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
f920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
f930: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
f940: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
f950: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
f960: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72  time after.** cr
f970: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75  eating the virtu
f980: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69  al machine.  Thi
f990: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67  s involves thing
f9a0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c  s such.** as all
f9b0: 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72  ocating register
f9c0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  s and initializi
f9d0: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
f9e0: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
f9f0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
fa00: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
fa10: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
fa20: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
fa30: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
fa40: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
fa50: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
fa60: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
fa70: 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65  xactly once on e
fa80: 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68  ach virtual mach
fa90: 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ine..** After th
faa0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
fab0: 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20  lled the VM has 
fac0: 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20  been "packaged" 
fad0: 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20  and is ready.** 
fae0: 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74  to run.  After t
faf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
fb00: 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63  alled, further c
fb10: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  alls to .** sqli
fb20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66  te3VdbeAddOp() f
fb30: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f  unctions are pro
fb40: 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72  hibited.  This r
fb50: 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63  outine disconnec
fb60: 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66  ts.** the Vdbe f
fb70: 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62  rom the Parse ob
fb80: 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64  ject that helped
fb90: 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20   generate it so 
fba0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20  that the.** the 
fbb0: 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20  Vdbe becomes an 
fbc0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69  independent enti
fbd0: 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65  ty and the Parse
fbe0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a   object can be.*
fbf0: 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  * destroyed..**.
fc00: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  ** Use the sqlit
fc10: 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70  e3VdbeRewind() p
fc20: 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74  rocedure to rest
fc30: 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  ore a virtual ma
fc40: 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f  chine back.** to
fc50: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61   its initial sta
fc60: 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20  te after it has 
fc70: 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  been run..*/.voi
fc80: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  d sqlite3VdbeMak
fc90: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a  eReady(.  Vdbe *
fca0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
fcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fcc0: 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20  VDBE */.  Parse 
fcd0: 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20  *pParse         
fce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
fcf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29  ing context */.)
fd00: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
fd30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
fd40: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20  .  int nVar;    
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
fd70: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69  arameters */.  i
fd80: 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  nt nMem;        
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65   Number of VM me
fdb0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a  mory registers *
fdc0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b  /.  int nCursor;
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fde0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fdf0: 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64  cursors required
fe00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fe30: 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73  f arguments in s
fe40: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20  ubprograms */.  
fe50: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
fe80: 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61  /.  struct Reusa
fe90: 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20  bleSpace x;     
fea0: 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62     /* Reusable b
feb0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20  ulk memory */.. 
fec0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
fed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
fee0: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
fef0: 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
ff00: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
ff10: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
ff20: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
ff30: 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65  Parse==p->pParse
ff40: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
ff50: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
ff60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
ff70: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
ff80: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
ff90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ffa0: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
ffb0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ffc0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ffd0: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63  Arg;.  .  /* Eac
ffe0: 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20  h cursor uses a 
fff0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68  memory cell.  Th
10000 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28  e first cursor (
10010 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20  cursor 0) can.  
10020 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77  ** use aMem[0] w
10030 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65  hich is not othe
10040 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68  rwise used by th
10050 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
10060 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   Allocate.  ** s
10070 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
10080 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75  of aMem[] for cu
10090 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61  rsors 1 and grea
100a0 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c  ter..  ** See al
100b0 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
100c0 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
100d0 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  m += nCursor;.  
100e0 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26  if( nCursor==0 &
100f0 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b  & nMem>0 ) nMem+
10100 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72  +;  /* Space for
10110 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66   aMem[0] even if
10120 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20   not used */..  
10130 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
10140 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20  w much reusable 
10150 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61  memory is availa
10160 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ble at the end o
10170 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64  f the.  ** opcod
10180 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65  e array.  This e
10190 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  xtra memory will
101a0 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
101b0 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e  for other elemen
101c0 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ts.  ** of the p
101d0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
101e0 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f  t..  */.  n = RO
101f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a  UND8(sizeof(Op)*
10200 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20  p->nOp);        
10210 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
10220 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  f opcode memory 
10230 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61  used */.  x.pSpa
10240 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61  ce = &((u8*)p->a
10250 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20  Op)[n];         
10260 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
10270 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f  opcode memory */
10280 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
10290 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
102a0 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78  x.pSpace) );.  x
102b0 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f  .nFree = ROUNDDO
102c0 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70  WN8(pParse->szOp
102d0 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20  Alloc - n);  /* 
102e0 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
102f0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
10300 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29  rt( x.nFree>=0 )
10310 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
10320 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
10330 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72  (&x.pSpace[x.nFr
10340 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ee]) );..  resol
10350 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
10360 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
10370 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
10380 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
10390 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
103a0 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
103b0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
103c0 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
103d0 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
103e0 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64    }.  p->expired
103f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f   = 0;..  /* Memo
10400 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73  ry for registers
10410 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75  , parameters, cu
10420 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c  rsor, etc, is al
10430 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f  located in one o
10440 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  r two.  ** passe
10450 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
10460 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
10470 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65   reuse unused me
10480 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a  mory at the .  *
10490 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
104a0 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
104b0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
104c0 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
104d0 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
104e0 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
104f0 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
10500 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
10510 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
10520 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
10530 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e  e remainder usin
10540 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79  g a fresh memory
10550 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
10560 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
10570 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
10580 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
10590 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
105a0 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
105b0 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65   the leftover me
105c0 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20  mory at the end 
105d0 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
105e0 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73  ray.  This can s
105f0 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
10600 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
10610 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
10620 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
10630 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
10640 0a 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30  .  x.nNeeded = 0
10650 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c  ;.  p->aMem = al
10660 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10670 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
10680 29 3b 0a 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  );.  p->aVar = a
10690 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c  llocSpace(&x, 0,
106a0 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
106b0 29 29 3b 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d  ));.  p->apArg =
106c0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
106d0 30 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  0, nArg*sizeof(M
106e0 65 6d 2a 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73  em*));.  p->apCs
106f0 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
10700 78 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69  x, 0, nCursor*si
10710 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
10720 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
10730 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
10740 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e  ANSTATUS.  p->an
10750 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
10760 65 28 26 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  e(&x, 0, p->nOp*
10770 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
10780 6e 64 69 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65  ndif.  if( x.nNe
10790 65 64 65 64 20 29 7b 0a 20 20 20 20 78 2e 70 53  eded ){.    x.pS
107a0 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20  pace = p->pFree 
107b0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
107c0 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65  cRawNN(db, x.nNe
107d0 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72  eded);.    x.nFr
107e0 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a  ee = x.nNeeded;.
107f0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
10800 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10810 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
10820 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10830 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
10840 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d  (Mem));.      p-
10850 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
10860 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20  ce(&x, p->aVar, 
10870 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
10880 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
10890 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  g = allocSpace(&
108a0 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  x, p->apArg, nAr
108b0 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
108c0 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20  .      p->apCsr 
108d0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
108e0 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73   p->apCsr, nCurs
108f0 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
10900 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
10910 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10920 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
10930 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
10940 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
10950 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
10960 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23  *sizeof(i64));.#
10970 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
10980 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70  .  p->pVList = p
10990 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20  Parse->pVList;. 
109a0 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
109b0 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
109c0 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
109d0 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  lain;.  if( db->
109e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
109f0 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b      p->nVar = 0;
10a00 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
10a10 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  = 0;.    p->nMem
10a20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
10a30 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
10a40 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e  nCursor;.    p->
10a50 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
10a60 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  ar;.    initMemA
10a70 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56  rray(p->aVar, nV
10a80 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  ar, db, MEM_Null
10a90 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  );.    p->nMem =
10aa0 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d   nMem;.    initM
10ab0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
10ac0 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55   nMem, db, MEM_U
10ad0 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d  ndefined);.    m
10ae0 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20  emset(p->apCsr, 
10af0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
10b00 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10b10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10b20 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10b30 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74  TATUS.    memset
10b40 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70  (p->anExec, 0, p
10b50 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
10b60 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ));.#endif.  }. 
10b70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
10b80 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
10b90 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
10ba0 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
10bb0 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
10bc0 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
10bd0 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
10be0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
10bf0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
10c00 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
10c10 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
10c20 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
10c30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
10c40 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d  sert( pCx->pBtx=
10c50 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
10c60 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
10c70 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
10c80 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
10c90 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
10ca0 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
10cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
10cc0 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
10cd0 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
10ce0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
10cf0 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
10d00 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
10d10 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  ->isEphemeral ){
10d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78  .        if( pCx
10d30 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33  ->pBtx ) sqlite3
10d40 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
10d50 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  pBtx);.        /
10d60 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
10d70 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
10d80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
10d90 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
10da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
10db0 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
10dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
10de0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
10df0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10e00 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
10e10 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
10e20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10e30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
10e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10e50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10e60 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
10e70 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
10e80 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
10e90 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
10ea0 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
10eb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
10ec0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
10ed0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
10ee0 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
10ef0 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
10f00 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
10f10 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
10f20 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
10f30 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
10f40 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
10f50 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
10f60 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
10f70 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10f80 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10f90 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
10fa0 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
10fb0 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
10fc0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
10fd0 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
10fe0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10ff0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
11000 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
11010 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
11020 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
11030 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
11040 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
11050 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
11060 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
11070 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
11080 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11090 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
110a0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
110b0 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
110c0 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
110d0 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
110e0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
110f0 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
11100 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
11110 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
11120 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
11130 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
11140 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
11150 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
11160 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
11170 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
11180 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
11190 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
111a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
111b0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
111c0 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
111d0 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
111e0 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
111f0 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
11200 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
11210 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
11220 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
11230 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
11240 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
11250 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
11260 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
11270 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
11280 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
11290 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
112a0 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
112b0 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
112c0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
112d0 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
112e0 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
112f0 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
11300 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
11310 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
11320 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
11330 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
11340 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
11350 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
11360 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
11370 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
11380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
11390 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
113a0 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
113b0 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
113c0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
113d0 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
113e0 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
113f0 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
11400 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
11410 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
11420 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
11430 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
11440 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
11450 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
11460 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
11470 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
11480 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
11490 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
114a0 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
114b0 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
114c0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
114d0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
114e0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
114f0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
11500 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
11510 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
11520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
11530 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
11540 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
11550 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
11560 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
11570 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
11580 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
11590 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
115a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
115b0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
115c0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
115d0 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
115e0 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
115f0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
11600 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
11610 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
11620 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
11630 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
11640 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
11650 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
11660 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
11670 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
11680 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
11690 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
116a0 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
116b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
116c0 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
116d0 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
116e0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
116f0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
11700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11710 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
11720 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
11730 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
11740 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
11750 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
11760 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
11770 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
11780 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
11790 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
117a0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
117b0 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
117c0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
117d0 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
117e0 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
117f0 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
11800 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
11810 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
11820 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
11830 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
11840 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11850 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11860 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65  b;..  if( p->nRe
11870 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  sColumn ){.    r
11880 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
11890 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
118a0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
118b0 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_N);.    sqlite
118c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
118d0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ColName);.  }.  
118e0 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
118f0 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
11900 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
11910 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
11920 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  ->aColName = (Me
11930 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
11940 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
11950 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
11960 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
11970 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
11980 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
11990 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d  olName, n, db, M
119a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  EM_Null);.}../*.
119b0 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
119c0 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
119d0 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
119e0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
119f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
11a00 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
11a10 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
11a20 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
11a30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
11a40 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
11a50 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
11a60 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
11a70 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
11a80 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
11a90 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
11aa0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
11ab0 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
11ac0 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
11ad0 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
11ae0 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
11af0 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
11b00 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
11b10 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
11b20 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
11b30 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
11b40 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
11b50 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
11b60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
11b70 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
11b80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
11ba0 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
11bb0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
11bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11be0 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
11bf0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
11c00 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
11c30 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
11c40 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
11c50 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
11c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11c70 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
11c80 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
11c90 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
11ca0 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
11cb0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
11cc0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
11cd0 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
11ce0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
11cf0 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
11d00 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
11d10 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
11d20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
11d30 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
11d40 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11d50 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
11d60 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
11d70 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
11d80 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
11d90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
11da0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
11db0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
11dc0 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
11dd0 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
11de0 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
11df0 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
11e00 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
11e10 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
11e20 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
11e30 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
11e40 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
11e50 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
11e60 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
11e70 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
11e80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11e90 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
11ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
11eb0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
11ec0 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
11ed0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
11ee0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11ef0 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
11f00 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
11f10 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
11f20 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
11f30 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
11f40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
11f50 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
11f60 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
11f70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11f80 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
11f90 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
11fa0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
11fb0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
11fc0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
11fd0 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
11fe0 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
11ff0 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
12000 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
12030 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
12040 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
12050 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
12060 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
12070 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
12080 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12090 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
120a0 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
120b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
120c0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
120d0 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
120e0 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
120f0 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
12100 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
12110 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
12120 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
12130 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
12140 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
12150 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
12160 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
12170 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
12180 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
12190 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
121a0 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
121b0 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
121c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
121d0 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
121e0 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
121f0 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
12200 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
12210 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
12220 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
12230 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
12240 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
12250 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
12260 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
12270 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
12280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12290 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
122a0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
122b0 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
122c0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
122d0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
122e0 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
122f0 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
12300 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
12310 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
12320 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
12330 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
12340 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
12350 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
12360 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
12370 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
12380 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
12390 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
123a0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
123b0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
123c0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
123d0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
123e0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
123f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
12400 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
12410 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
12420 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12430 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
12440 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
12450 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
12460 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
12470 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
12480 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
12490 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
124a0 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
124b0 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
124c0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
124d0 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
124e0 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
124f0 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
12500 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
12510 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
12520 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
12530 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
12540 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
12550 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
12560 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
12570 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
12580 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
12590 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
125a0 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
125b0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
125c0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
125d0 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
125e0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
125f0 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
12600 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
12610 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
12620 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
12630 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
12640 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
12650 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
12660 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12670 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
12680 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
12690 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
126a0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
126b0 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
126c0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
126d0 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
126e0 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
126f0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
12700 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
12710 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12720 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61  PagerIsMemdb(pPa
12730 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ger)==0.      ){
12740 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
12750 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
12760 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
12770 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
12780 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
12790 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
127a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
127b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
127c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
127d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
127e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
127f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12800 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
12810 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
12820 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
12830 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
12840 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
12850 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
12860 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
12870 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
12880 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
12890 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
128a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
128b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
128c0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
128d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
128e0 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
128f0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
12900 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
12910 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
12920 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
12930 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
12940 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
12950 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
12960 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
12970 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
12980 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
12990 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
129a0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
129b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
129c0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
129d0 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
129e0 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
129f0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
12a00 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
12a10 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
12a20 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
12a30 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
12a40 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
12a50 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
12a60 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
12a70 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
12a80 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
12a90 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
12aa0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
12ab0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
12ac0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
12ad0 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
12ae0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
12af0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
12b00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12b10 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12b20 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12b30 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12b50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
12b60 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
12b70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12b80 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
12b90 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
12ba0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
12bb0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
12bc0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
12bd0 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
12be0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
12bf0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
12c00 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
12c10 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
12c20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
12c30 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
12c40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
12c50 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
12c60 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
12c70 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
12c80 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
12c90 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
12ca0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
12cb0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
12cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12cd0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12ce0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
12cf0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12d00 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12d10 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12d20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12d30 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
12d40 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
12d50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
12d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12d70 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
12d80 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
12d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
12da0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
12db0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
12dc0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
12dd0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
12de0 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
12df0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12e00 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
12e10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12e20 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
12e30 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
12e40 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12e50 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
12e60 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
12e70 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
12e80 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
12e90 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
12ea0 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
12eb0 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
12ec0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
12ed0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
12ee0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
12ef0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
12f00 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
12f10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
12f20 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
12f30 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
12f40 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
12f50 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
12f60 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
12f70 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
12f80 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
12f90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
12fa0 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
12fb0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
12fc0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
12fd0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
12fe0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
12ff0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
13000 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
13010 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
13020 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
13030 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13040 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
13050 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
13060 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
13070 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
13080 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
13090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
130a0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
130b0 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
130c0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
130d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
130e0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
130f0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
13100 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13110 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13120 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
13130 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13140 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
13150 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
13160 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
13170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13180 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
13190 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
131a0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
131b0 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
131c0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
131d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
131e0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
131f0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
13200 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
13230 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
13240 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
13250 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
13260 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
13270 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
13280 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
13290 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
132a0 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
132b0 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
132c0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
132d0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
132e0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
132f0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
13300 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
13310 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
13320 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
13330 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
13340 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
13350 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
13360 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
13370 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
13380 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
13390 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
133a0 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
133b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
133c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
133d0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
133e0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
133f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13400 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
13410 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
13420 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
13430 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
13440 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
13450 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
13460 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13470 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
13480 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
13490 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
134a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
134b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
134c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
134d0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
134e0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
134f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
13500 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
13510 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
13520 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
13530 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
13540 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
13550 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
13560 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
13570 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
13580 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
13590 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
135a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
135b0 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
135c0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
135d0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
135e0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
135f0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
13600 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
13610 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
13620 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
13630 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
13640 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
13650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
13660 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
13670 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
13680 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13690 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
136a0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
136b0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
136c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
136d0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
136e0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
136f0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
13700 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
13710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13720 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
13730 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
13740 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
13750 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
13760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
13770 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
13780 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13790 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
137a0 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
137b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
137c0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
137d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
137e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
137f0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
13800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
13820 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
13830 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
13840 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
13850 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
13860 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
13870 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13880 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
13890 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
138a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
138b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
138c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
138d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
138e0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
138f0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
13900 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
13910 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
13920 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
13930 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
13940 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
13950 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
13960 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
13970 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
13980 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
13990 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
139a0 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
139b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
139c0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
139d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
139e0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
139f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13a00 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
13a10 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
13a20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
13a30 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
13a40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
13a50 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
13a60 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
13a70 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
13a80 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
13a90 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
13aa0 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
13ab0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
13ac0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
13ad0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
13ae0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
13af0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
13b00 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
13b10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13b20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13b30 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
13b40 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
13b50 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
13b60 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
13b70 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
13b80 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
13b90 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
13ba0 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
13bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
13bc0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
13bd0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
13be0 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
13bf0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
13c00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
13c10 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
13c20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
13c30 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
13c40 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
13c50 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
13c60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
13c70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
13c80 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
13c90 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13ca0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13cb0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
13cc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
13cd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13ce0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
13cf0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13d00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
13d10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
13d20 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
13d30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
13d40 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
13d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13d60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13d70 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13d80 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13d90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
13da0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
13db0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13dc0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
13dd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13de0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
13df0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
13e00 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
13e10 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
13e20 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
13e30 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e40 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
13e50 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
13e60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13e70 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
13e80 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
13e90 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
13ea0 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
13eb0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
13ec0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
13ed0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
13ee0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
13ef0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
13f00 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
13f10 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
13f20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
13f30 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
13f40 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13f50 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
13f60 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
13f70 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
13f80 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
13f90 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
13fa0 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
13fb0 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
13fc0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
13fd0 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
13fe0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
13ff0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
14000 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
14010 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
14020 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
14030 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
14040 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
14050 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
14060 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
14070 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
14080 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
14090 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
140a0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
140b0 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
140c0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
140d0 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
140e0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
140f0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
14100 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
14110 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
14120 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
14130 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
14140 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
14150 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
14160 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
14170 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14180 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
14190 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
141a0 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
141b0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
141c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
141d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
141e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
141f0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
14200 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
14210 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
14220 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
14230 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
14240 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
14250 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
14260 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
14270 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
14280 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
14290 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
142a0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
142b0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
142c0 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
142d0 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
142e0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
142f0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
14300 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14310 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
14320 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
14330 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14340 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
14350 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
14360 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
14370 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
14380 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
14390 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
143a0 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
143b0 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
143c0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
143d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
143e0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
143f0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
14400 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
14410 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
14420 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
14430 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
14440 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
14450 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
14460 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
14470 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
14480 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
14490 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
144a0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
144b0 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
144c0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
144d0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
144e0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
144f0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
14500 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
14510 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
14520 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
14530 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
14540 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
14550 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
14560 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
14570 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
14580 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
14590 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
145a0 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
145b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
145c0 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
145d0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
145e0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
145f0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
14600 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14610 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
14620 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14630 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
14640 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
14650 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
14660 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
14670 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
14680 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
14690 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
146a0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  _OK..*/.static S
146b0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
146c0 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  nt vdbeCloseStat
146d0 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
146e0 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
146f0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
14700 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
14710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
14720 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
14730 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
14740 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
14750 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
14760 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14770 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
14780 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
14790 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
147a0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
147b0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
147c0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
147d0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
147e0 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69  int) );..  for(i
147f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
14800 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63  ++){ .    int rc
14810 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
14820 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
14830 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
14840 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
14850 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
14860 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14870 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
14880 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
14890 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
148a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
148b0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
148c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
148d0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
148e0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
148f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
14900 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
14910 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
14920 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
14930 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
14940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14950 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
14960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14970 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  }.  db->nStateme
14980 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74  nt--;.  p->iStat
14990 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ement = 0;..  if
149a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
149b0 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  ){.    if( eOp==
149c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
149d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
149e0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
149f0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
14a00 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
14a10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
14a20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14a40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
14a50 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
14a60 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
14a70 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
14a80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
14a90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
14aa0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
14ab0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
14ac0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
14ad0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
14ae0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
14af0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
14b00 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
14b10 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
14b20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
14b30 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
14b40 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
14b50 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
14b60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
14b70 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
14b80 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
14b90 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  efCons;.    db->
14ba0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
14bb0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
14bc0 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74  mCons;.  }.  ret
14bd0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
14be0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
14bf0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
14c00 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28   int eOp){.  if(
14c10 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65   p->db->nStateme
14c20 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
14c30 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ent ){.    retur
14c40 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  n vdbeCloseState
14c50 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20  ment(p, eOp);.  
14c60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14c70 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14c80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14c90 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
14ca0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
14cb0 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
14cc0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
14cd0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14ce0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
14cf0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
14d00 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
14d10 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
14d20 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
14d30 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
14d40 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
14d50 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
14d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14d70 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
14d80 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
14d90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
14da0 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
14db0 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
14dc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
14dd0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
14de0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
14df0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
14e00 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
14e10 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
14e20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
14e30 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
14e40 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
14e50 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
14e60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14e70 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
14e80 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
14e90 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
14ea0 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
14eb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
14ec0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
14ed0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
14ee0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
14ef0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
14f00 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
14f10 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
14f20 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
14f30 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
14f40 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14f50 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
14f60 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
14f70 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
14f80 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
14f90 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
14fa0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
14fb0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
14fc0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
14fd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14fe0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
14ff0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15000 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
15010 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
15020 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
15030 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
15040 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
15050 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
15060 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
15070 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
15080 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
15090 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
150a0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
150b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
150c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
150d0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
150e0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
150f0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
15100 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
15110 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
15120 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
15130 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
15140 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
15150 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
15160 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
15170 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
15180 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
15190 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
151a0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
151b0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
151c0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
151d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
151e0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
151f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
15200 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
15210 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
15220 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
15230 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
15240 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15250 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
15260 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
15290 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
152a0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
152b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
152c0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
152d0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
152e0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
152f0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
15300 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
15310 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
15320 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
15330 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
15340 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
15350 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
15360 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
15370 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
15380 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
15390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
153a0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
153b0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
153c0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
153d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
153e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
153f0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
15400 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
15410 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
15420 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
15430 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
15440 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
15450 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
15460 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
15470 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
15480 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15490 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
154a0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
154b0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
154c0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
154d0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
154e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
154f0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
15500 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
15510 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15520 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
15530 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
15540 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
15550 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
15560 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  KPT;.  }.  close
15570 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
15580 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
15590 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
155a0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
155b0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
155c0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
155d0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
155e0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
155f0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
15600 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
15610 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
15620 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
15630 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
15640 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
15650 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
15660 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
15670 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
15680 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
15690 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
156a0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
156b0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
156c0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
156d0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
156e0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
156f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
15700 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
15710 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
15720 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
15730 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
15740 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
15750 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
15760 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
15770 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
15780 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
15790 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
157a0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
157c0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
157d0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
157e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
157f0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
15800 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
15810 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
15820 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
15830 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
15840 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
15850 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
15860 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
15870 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
15880 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
15890 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
158a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
158b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
158c0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
158d0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
158e0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
158f0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
15900 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
15910 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
15920 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
15930 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
15940 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
15950 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
15960 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
15970 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
15980 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
15990 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
159a0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
159b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
159c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
159d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
159e0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
159f0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
15a00 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
15a10 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
15a20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
15a30 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
15a40 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
15a50 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
15a60 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
15a70 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
15a80 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
15a90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15aa0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
15ab0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
15ac0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
15ad0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
15ae0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
15af0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
15b00 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
15b10 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
15b20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
15b30 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
15b40 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
15b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15b60 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
15b70 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
15b80 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
15b90 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
15ba0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
15bb0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
15bc0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
15bd0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
15be0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
15bf0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
15c00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15c10 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
15c20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
15c30 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
15c40 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
15c50 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
15c60 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
15c70 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
15c80 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
15c90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
15ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15cb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
15cc0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
15cd0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
15ce0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
15cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15d10 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
15d20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
15d30 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
15d40 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
15d50 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
15d60 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
15d70 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
15d80 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
15d90 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
15da0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
15db0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
15dc0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
15dd0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
15de0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
15df0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
15e00 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
15e10 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
15e20 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
15e30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
15e40 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
15e50 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
15e60 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
15e70 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
15e80 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
15e90 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
15ea0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
15eb0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
15ec0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
15ed0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
15ee0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
15ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15f00 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
15f10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
15f40 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
15f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15f60 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
15f70 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
15f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15f90 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
15fa0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
15fb0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
15fc0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
15fd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
15fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15ff0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
16000 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
16010 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
16020 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
16030 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
16040 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
16050 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
16060 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
16070 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
16080 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
16090 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
160a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
160b0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
160c0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
160d0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
160e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
160f0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
16100 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
16110 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16120 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
16130 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
16140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16150 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
16160 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16170 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
16190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
161a0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
161b0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
161c0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
161d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
161e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
161f0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16210 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
16220 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
16230 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
16240 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
16250 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
16260 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49  gs &= ~(u64)SQLI
16270 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
16280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
16290 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
162a0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
162b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
162c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
162d0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
162e0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
162f0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16300 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16310 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
16320 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
16330 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
16340 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
16350 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16360 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
16370 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
16380 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
16390 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
163a0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
163b0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
163c0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
163d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
163e0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
163f0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
16400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16410 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
16420 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
16430 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
16440 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
16450 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
16460 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
16470 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
16480 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
16490 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
164a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
164b0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
164c0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
164d0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
164e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
164f0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
16500 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
16510 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
16520 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16530 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
16540 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
16550 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
16560 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
16570 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
16580 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
16590 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
165a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
165b0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
165c0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
165d0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
165e0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
165f0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
16600 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
16610 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
16620 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16630 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
16640 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
16650 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16660 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16670 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
16680 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
16690 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
166a0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
166b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
166c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
166d0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
166e0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
166f0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
16700 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16710 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16720 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16730 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16740 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
16750 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
16760 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16770 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16780 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
16790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
167a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
167b0 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
167c0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
167d0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
167e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
167f0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
16800 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
16810 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
16820 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
16830 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
16840 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
16850 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
16860 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
16870 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
16880 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
16890 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
168a0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
168b0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
168c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
168d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
168e0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
168f0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
16900 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
16910 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
16920 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
16930 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
16940 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
16950 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
16960 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
16970 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
16980 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
16990 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
169a0 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
169b0 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
169c0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
169d0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
169e0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
169f0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
16a00 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
16a10 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
16a20 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
16a30 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
16a40 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
16a50 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
16a60 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
16a70 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
16a80 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
16a90 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16aa0 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
16ab0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
16ac0 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
16ad0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
16ae0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
16af0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16b00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16b10 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
16b20 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
16b30 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
16b40 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
16b50 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
16b60 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
16b70 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
16b80 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
16b90 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
16ba0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
16bb0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
16bc0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
16bd0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
16be0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
16bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
16c00 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
16c10 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
16c20 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
16c30 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
16c40 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
16c50 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
16c60 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
16c70 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
16c80 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
16c90 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
16ca0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
16cb0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
16cc0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
16cd0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
16ce0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
16cf0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
16d00 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
16d10 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
16d20 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
16d30 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
16d40 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
16d50 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
16d60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16d70 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
16d80 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
16d90 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
16da0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
16db0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
16dc0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
16dd0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
16de0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
16df0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
16e00 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
16e10 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
16e20 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
16e30 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
16e40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16e50 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
16e60 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
16e70 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
16e80 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
16e90 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
16ea0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
16eb0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
16ec0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
16ed0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
16ee0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
16ef0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
16f00 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
16f10 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
16f20 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
16f30 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
16f40 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
16f50 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
16f60 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
16f70 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
16f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
16f90 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
16fa0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
16fb0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
16fc0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
16fd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
16fe0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
16ff0 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
17000 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73  Malloc--;.  }els
17010 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29  e if( db->pErr )
17020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
17030 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45  ueSetNull(db->pE
17040 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65  rr);.  }.  db->e
17050 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72  rrCode = rc;.  r
17060 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
17070 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17080 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
17090 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
170a0 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
170b0 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
170c0 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
170d0 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
170e0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
170f0 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
17100 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
17110 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
17120 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
17130 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
17140 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
17150 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
17160 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
17170 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
17180 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
17190 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
171a0 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
171b0 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
171c0 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
171d0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
171e0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
171f0 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
17200 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17210 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
17220 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
17230 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
17240 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
17250 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
17260 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
17270 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
17280 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
17290 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
172a0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
172b0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
172c0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
172d0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
172e0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
172f0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
17300 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
17310 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
17320 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
17330 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
17340 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
17350 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
17360 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
17370 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
17380 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
17390 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
173a0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
173b0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
173c0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
173d0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
173e0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
173f0 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
17400 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
17410 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
17420 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
17430 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
17440 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
17450 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
17460 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
17470 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   i;.#endif..  sq
17480 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
17490 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
174a0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
174b0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
174c0 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
174d0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
174e0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
174f0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
17500 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
17510 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
17520 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
17530 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
17540 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
17550 65 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20  e VDBE has been 
17560 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
17570 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
17580 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
17590 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
175a0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
175b0 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
175c0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
175d0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
175e0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
175f0 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
17600 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
17610 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
17620 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
17630 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
17640 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
17650 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
17660 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
17670 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
17680 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
17690 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
176a0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
176b0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
176c0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  r(p);.    if( p-
176d0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
176e0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
176f0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
17700 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
17710 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
17720 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
17730 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
17740 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
17750 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
17760 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
17770 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
17780 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
17790 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
177a0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
177b0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
177c0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
177d0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
177e0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
177f0 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
17800 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
17810 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
17820 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
17830 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  et register cont
17840 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d  ents and reclaim
17850 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
17860 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  emory..  */.#ifd
17870 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17880 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
17890 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
178a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
178b0 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
178c0 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
178d0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
178e0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
178f0 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
17900 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
17910 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
17920 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
17930 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
17940 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
17950 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
17960 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
17970 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
17980 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
17990 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
179a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
179b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
179c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
179d0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
179e0 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
179f0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
17a00 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69  _DEBUG.  p->nWri
17a10 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
17a20 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
17a30 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
17a40 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
17a50 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
17a60 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
17a70 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
17a80 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
17a90 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
17aa0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
17ab0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
17ac0 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
17ad0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
17ae0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
17af0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17b00 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
17b10 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
17b20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
17b30 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
17b40 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
17b50 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
17b60 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
17b70 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17b80 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
17b90 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
17ba0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
17bb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
17bc0 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
17bd0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
17be0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
17bf0 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
17c00 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
17c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17c20 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
17c30 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
17c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
17c50 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
17c60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17c70 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
17c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17c90 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
17ca0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
17cb0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
17cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
17cd0 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
17ce0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
17cf0 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
17d00 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
17d10 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
17d20 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
17d30 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
17d40 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
17d50 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
17d60 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
17d70 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
17d80 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
17d90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
17da0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
17db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
17dc0 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
17dd0 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b  DBE_MAGIC_RESET;
17de0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
17df0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
17e00 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
17e10 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
17e20 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
17e30 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
17e40 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
17e50 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
17e60 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
17e70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
17e80 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
17e90 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
17ea0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
17eb0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
17ec0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17ed0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
17ee0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
17ef0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
17f00 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
17f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
17f20 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
17f30 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
17f40 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
17f50 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
17f60 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
17f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17f80 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
17f90 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
17fa0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
17fb0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
17fc0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
17fd0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
17fe0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
17ff0 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
18000 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
18010 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
18020 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
18030 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
18040 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
18050 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
18060 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
18070 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
18080 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
18090 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
180a0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
180b0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
180c0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
180d0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
180e0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
180f0 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
18100 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
18110 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
18120 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
18130 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
18140 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
18150 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
18160 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
18170 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
18180 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
18190 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
181a0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
181b0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
181c0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
181d0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
181e0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
181f0 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
18200 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
18210 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
18220 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
18230 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
18240 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
18250 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
18260 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
18270 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
18280 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
18290 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
182a0 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20  iAuxOp==iOp.    
182b0 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69        && pAux->i
182c0 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20  AuxArg>=0.      
182d0 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41      && (pAux->iA
182e0 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  uxArg>31 || !(ma
182f0 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
18300 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29  Aux->iAuxArg))))
18310 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
18320 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
18330 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  uxArg==31 );.   
18340 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
18350 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20  leteAux ){.     
18360 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
18370 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  Aux(pAux->pAux);
18380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18390 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
183a0 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Aux;.      sqlit
183b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75  e3DbFree(db, pAu
183c0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
183d0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
183e0 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a  pNextAux;.    }.
183f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
18400 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
18410 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18420 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
18430 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
18440 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
18450 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
18460 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
18470 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
18480 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
18490 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
184a0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
184b0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
184c0 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
184d0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
184e0 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
184f0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
18500 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
18510 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
18520 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
18530 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
18540 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
18550 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
18560 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
18570 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
18580 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
18590 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
185a0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
185b0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
185c0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
185d0 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
185e0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
185f0 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
18600 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
18610 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
18620 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
18630 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
18640 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
18650 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
18660 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
18670 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
18680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d  ;.  }.  if( p->m
18690 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
186a0 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c  _INIT ){.    rel
186b0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
186c0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
186d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
186e0 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29  e(db, p->pVList)
186f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
18700 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
18710 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65  );.  }.  vdbeFre
18720 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
18730 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
18740 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18750 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
18760 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18770 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69  db, p->zSql);.#i
18780 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18790 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73  LE_NORMALIZE.  s
187a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
187b0 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20   p->zNormSql);. 
187c0 20 7b 0a 20 20 20 20 44 62 6c 71 75 6f 74 65 53   {.    DblquoteS
187d0 74 72 20 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78  tr *pThis, *pNex
187e0 74 3b 0a 20 20 20 20 66 6f 72 28 70 54 68 69 73  t;.    for(pThis
187f0 3d 70 2d 3e 70 44 62 6c 53 74 72 3b 20 70 54 68  =p->pDblStr; pTh
18800 69 73 3b 20 70 54 68 69 73 3d 70 4e 65 78 74 29  is; pThis=pNext)
18810 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
18820 70 54 68 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b  pThis->pNextStr;
18830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
18840 46 72 65 65 28 64 62 2c 20 70 54 68 69 73 29 3b  Free(db, pThis);
18850 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
18860 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
18870 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
18880 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69  STATUS.  {.    i
18890 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
188a0 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69  0; i<p->nScan; i
188b0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
188c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
188d0 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  aScan[i].zName);
188e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
188f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
18900 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  aScan);.  }.#end
18910 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
18920 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
18930 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
18940 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
18950 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
18960 20 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   *db;..  assert(
18970 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20   p!=0 );.  db = 
18980 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
18990 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
189a0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
189b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
189c0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
189d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
189e0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
189f0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
18a00 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
18a10 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
18a20 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
18a30 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
18a40 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
18a50 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
18a60 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
18a70 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
18a80 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
18a90 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
18aa0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
18ab0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
18ac0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
18ad0 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61  cursor "p" has a
18ae0 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70   pending seek op
18af0 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73  eration that has
18b00 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a   not yet been.**
18b10 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53   carried out.  S
18b20 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e  eek the cursor n
18b30 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  ow.  If an error
18b40 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a   occurs, return.
18b50 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
18b60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
18b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
18b80 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
18b90 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
18ba0 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
18bb0 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b  {.  int res, rc;
18bc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
18bd0 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  EST.  extern int
18be0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
18bf0 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
18c00 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72  assert( p->defer
18c10 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61  redMoveto );.  a
18c20 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
18c30 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
18c40 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
18c50 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72  YPE_BTREE );.  r
18c60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18c70 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
18c80 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
18c90 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
18ca0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
18cb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18cc0 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29  ;.  if( res!=0 )
18cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18ce0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
18cf0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18d00 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
18d10 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
18d20 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  .  p->deferredMo
18d30 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  veto = 0;.  p->c
18d40 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
18d50 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75  HE_STALE;.  retu
18d60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18d70 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67  ./*.** Something
18d80 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f   has moved curso
18d90 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61  r "p" out of pla
18da0 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72  ce.  Maybe the r
18db0 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69  ow it was.** poi
18dc0 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65  nted to was dele
18dd0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
18de0 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65  er it.  Or maybe
18df0 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a   the btree was.*
18e00 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57  * rebalanced.  W
18e10 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73  hatever the caus
18e20 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72  e, try to restor
18e30 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61  e "p" to the pla
18e40 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70  ce it.** is supp
18e50 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  osed to be point
18e60 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77  ing.  If the row
18e70 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
18e80 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a   from under the.
18e90 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74  ** cursor, set t
18ea0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
18eb0 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77  nt to a NULL row
18ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18ed0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
18ee0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
18ef0 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  r(VdbeCursor *p)
18f00 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72  {.  int isDiffer
18f10 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73  entRow, rc;.  as
18f20 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
18f30 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
18f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18f50 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
18f60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
18f70 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
18f80 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
18f90 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  rsor) );.  rc = 
18fa0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
18fb0 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e  orRestore(p->uc.
18fc0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
18fd0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
18fe0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
18ff0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
19000 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
19010 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
19020 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19030 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
19040 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
19050 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
19060 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  .  Restore the c
19070 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64  ursor.** if need
19080 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79   be.  Return any
19090 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20   I/O error from 
190a0 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72  the restore oper
190b0 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
190c0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52  lite3VdbeCursorR
190d0 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f  estore(VdbeCurso
190e0 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
190f0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
19100 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
19110 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
19120 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
19130 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
19140 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
19150 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
19160 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19180 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
19190 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
191a0 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
191b0 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
191c0 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
191d0 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
191e0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
191f0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
19200 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
19210 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
19220 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
19230 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
19240 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
19250 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
19260 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
19270 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
19280 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
19290 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
192a0 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
192b0 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
192c0 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
192d0 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
192e0 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
192f0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
19300 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
19310 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
19320 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
19330 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
19340 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
19350 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
19360 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
19370 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
19380 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
19390 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
193a0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
193b0 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
193c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
193d0 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
193e0 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
193f0 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
19400 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29  *pp, int *piCol)
19410 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
19420 70 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72  p = *pp;.  asser
19430 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
19440 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
19450 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
19460 52 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a  RTYPE_PSEUDO );.
19470 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
19480 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
19490 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28  nt iMap;.    if(
194a0 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28   p->aAltMap && (
194b0 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61  iMap = p->aAltMa
194c0 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29  p[1+*piCol])>0 )
194d0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d  {.      *pp = p-
194e0 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
194f0 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70     *piCol = iMap
19500 20 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   - 1;.      retu
19510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19520 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68    }.    return h
19530 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
19540 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66  eto(p);.  }.  if
19550 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
19560 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
19570 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
19580 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
19590 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
195a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
195b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
195c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
195d0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
195e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
195f0 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
19600 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
19610 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
19620 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
19630 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19640 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
19650 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19660 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
19670 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
19680 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
19690 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
196a0 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
196b0 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
196c0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
196d0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
196e0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
196f0 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
19700 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
19710 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
19720 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
19730 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
19740 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
19750 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
19760 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
19770 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
19780 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
19790 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
197a0 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
197b0 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
197c0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
197d0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
197e0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
197f0 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
19800 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
19810 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
19820 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
19830 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
19840 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
19850 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
19860 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
19870 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
19880 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
19890 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
198a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
198b0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
198c0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
198d0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
198e0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
198f0 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
19900 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
19910 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
19920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
19930 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
19940 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
19950 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19970 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
19980 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
199b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
199c0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
199e0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
199f0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
19a00 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
19a10 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
19a20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19a30 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
19a60 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19a70 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
19a80 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
19a90 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19aa0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19ab0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
19ac0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
19ad0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
19ae0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
19b10 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
19b20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
19b30 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
19b40 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
19b50 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
19b80 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
19b90 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19bc0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
19bd0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
19be0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
19bf0 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
19c00 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
19c10 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
19c20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
19c30 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
19c40 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
19c50 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
19c60 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
19c70 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
19c80 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
19c90 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
19ca0 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
19cb0 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
19cc0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
19cd0 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
19ce0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
19cf0 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
19d00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19d10 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
19d20 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75  t file_format, u
19d30 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74  32 *pLen){.  int
19d40 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
19d50 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  lags;.  u32 n;..
19d60 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d    assert( pLen!=
19d70 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  0 );.  if( flags
19d80 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
19d90 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
19da0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19db0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
19dc0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
19dd0 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
19de0 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
19df0 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
19e00 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
19e10 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
19e20 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
19e30 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
19e40 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
19e50 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29  u;.    if( i<0 )
19e60 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a  {.      u = ~i;.
19e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19e80 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
19e90 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
19ea0 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d        if( (i&1)=
19eb0 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61  =i && file_forma
19ec0 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=4 ){.        
19ed0 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  *pLen = 0;.     
19ee0 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32     return 8+(u32
19ef0 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )u;.      }else{
19f00 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d  .        *pLen =
19f10 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
19f20 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
19f30 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
19f40 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  2767 ){ *pLen = 
19f50 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20  2; return 2; }. 
19f60 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
19f70 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20  7 ){ *pLen = 3; 
19f80 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20  return 3; }.    
19f90 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
19fa0 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20  7 ){ *pLen = 4; 
19fb0 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20  return 4; }.    
19fc0 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
19fd0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72   ){ *pLen = 6; r
19fe0 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a  eturn 5; }.    *
19ff0 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65  pLen = 8;.    re
1a000 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
1a010 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
1a020 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20   ){.    *pLen = 
1a030 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  8;.    return 7;
1a040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1a050 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
1a060 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
1a070 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
1a080 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a090 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
1a0a0 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
1a0b0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
1a0c0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
1a0d0 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
1a0e0 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d  o;.  }.  *pLen =
1a0f0 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e   n;.  return ((n
1a100 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
1a110 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
1a120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1a130 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
1a140 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
1a150 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  128.*/.static co
1a160 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
1a170 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
1a180 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30   {.        /*  0
1a190 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34     1   2   3   4
1a1a0 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38     5   6   7   8
1a1b0 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20     9 */   ./*   
1a1c0 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32  0 */   0,  1,  2
1a1d0 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38  ,  3,  4,  6,  8
1a1e0 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  8,  0,  0,./*
1a1f0 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c    10 */   0,  0,
1a200 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
1a210 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c    2,  2,  3,  3,
1a220 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20  ./*  20 */   4, 
1a230 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20   4,  5,  5,  6, 
1a240 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20   6,  7,  7,  8, 
1a250 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20   8,./*  30 */   
1a260 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31  9,  9, 10, 10, 1
1a270 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31  1, 11, 12, 12, 1
1a280 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f  3, 13,./*  40 */
1a290 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35    14, 14, 15, 15
1a2a0 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37  , 16, 16, 17, 17
1a2b0 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30  , 18, 18,./*  50
1a2c0 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c   */  19, 19, 20,
1a2d0 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c   20, 21, 21, 22,
1a2e0 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20   22, 23, 23,./* 
1a2f0 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20   60 */  24, 24, 
1a300 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20  25, 25, 26, 26, 
1a310 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a  27, 27, 28, 28,.
1a320 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32  /*  70 */  29, 2
1a330 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33  9, 30, 30, 31, 3
1a340 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33  1, 32, 32, 33, 3
1a350 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34  3,./*  80 */  34
1a360 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36  , 34, 35, 35, 36
1a370 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38  , 36, 37, 37, 38
1a380 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20  , 38,./*  90 */ 
1a390 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c   39, 39, 40, 40,
1a3a0 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c   41, 41, 42, 42,
1a3b0 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20   43, 43,./* 100 
1a3c0 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20  */  44, 44, 45, 
1a3d0 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20  45, 46, 46, 47, 
1a3e0 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31  47, 48, 48,./* 1
1a3f0 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35  10 */  49, 49, 5
1a400 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35  0, 50, 51, 51, 5
1a410 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f  2, 52, 53, 53,./
1a420 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34  * 120 */  54, 54
1a430 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36  , 55, 55, 56, 56
1a440 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a  , 57, 57.};../*.
1a450 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
1a460 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
1a470 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1a480 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
1a490 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
1a4a0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1a4b0 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
1a4c0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1a4d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1a4e0 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75  =128 ){.    retu
1a4f0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
1a500 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
1a510 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69      assert( seri
1a520 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20  al_type<12 .    
1a530 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
1a540 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1a550 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28  [serial_type]==(
1a560 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1a570 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )/2 );.    retur
1a580 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
1a590 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1a5a0 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73  ype];.  }.}.u8 s
1a5b0 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74  qlite3VdbeOneByt
1a5c0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
1a5d0 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  8 serial_type){.
1a5e0 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
1a5f0 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72  _type<128 );.  r
1a600 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
1a610 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1a620 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f  al_type];  .}../
1a630 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
1a640 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
1a650 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
1a660 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
1a670 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
1a680 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
1a690 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
1a6a0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
1a6b0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
1a6c0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
1a6d0 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
1a6e0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
1a6f0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
1a700 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
1a710 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
1a720 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
1a730 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
1a740 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
1a750 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
1a760 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
1a770 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
1a780 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
1a790 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
1a7a0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
1a7b0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
1a7c0 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
1a7d0 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
1a7e0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
1a7f0 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
1a800 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
1a810 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
1a820 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1a830 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
1a840 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
1a850 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
1a860 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
1a870 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
1a880 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
1a890 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
1a8a0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
1a8b0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
1a8c0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
1a8d0 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
1a8e0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
1a8f0 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
1a900 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
1a910 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
1a920 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
1a930 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
1a940 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
1a950 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
1a960 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
1a970 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
1a980 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
1a990 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
1a9a0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
1a9b0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
1a9c0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
1a9d0 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
1a9e0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
1a9f0 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
1aa00 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
1aa10 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
1aa20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
1aa30 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
1aa40 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
1aa50 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
1aa60 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
1aa70 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
1aa80 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
1aa90 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
1aaa0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
1aab0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
1aac0 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
1aad0 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
1aae0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
1aaf0 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
1ab00 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
1ab10 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
1ab20 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
1ab30 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
1ab40 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
1ab50 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
1ab60 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
1ab70 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
1ab80 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
1ab90 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
1aba0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
1abb0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
1abc0 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
1abd0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
1abe0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
1abf0 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
1ac00 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
1ac10 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
1ac20 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
1ac30 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
1ac40 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
1ac50 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
1ac60 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
1ac70 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
1ac80 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
1ac90 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
1aca0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
1acb0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
1acc0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
1acd0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
1ace0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
1acf0 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
1ad00 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
1ad10 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
1ad20 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
1ad30 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
1ad40 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
1ad50 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
1ad60 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
1ad70 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
1ad80 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
1ad90 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
1ada0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
1adb0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1adc0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
1add0 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
1ade0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
1adf0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
1ae00 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
1ae10 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
1ae20 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
1ae30 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1ae40 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1ae50 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
1ae60 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
1ae70 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1ae80 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1ae90 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
1aea0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
1aeb0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
1aec0 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
1aed0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1aee0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
1aef0 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
1af00 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
1af10 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
1af20 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
1af30 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
1af40 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
1af50 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
1af60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1af70 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1af80 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
1af90 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
1afa0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
1afb0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
1afc0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
1afd0 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
1afe0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1aff0 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
1b000 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
1b010 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
1b020 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1b030 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
1b040 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
1b050 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
1b060 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
1b070 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
1b080 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
1b090 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
1b0a0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
1b0b0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
1b0c0 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
1b0d0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1b0e0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1b0f0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
1b100 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
1b110 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
1b120 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
1b130 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
1b140 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
1b150 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b160 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
1b170 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
1b180 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
1b190 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
1b1a0 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
1b1b0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
1b1c0 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
1b1d0 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
1b1e0 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
1b1f0 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
1b200 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
1b210 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
1b220 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
1b230 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1b240 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
1b250 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
1b260 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
1b270 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
1b280 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
1b290 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
1b2a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b2b0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1b2c0 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
1b2d0 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
1b2e0 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63  if( len>0 ) memc
1b2f0 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
1b300 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
1b310 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
1b320 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
1b330 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
1b340 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
1b350 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
1b360 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
1b370 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
1b380 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
1b390 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
1b3a0 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
1b3b0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
1b3c0 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
1b3d0 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
1b3e0 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
1b3f0 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
1b400 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
1b410 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
1b420 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
1b430 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
1b440 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
1b450 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1b460 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
1b470 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
1b480 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
1b490 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
1b4a0 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1b4b0 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
1b4c0 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1b4d0 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
1b4e0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
1b4f0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
1b500 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
1b510 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
1b520 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
1b530 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
1b540 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
1b550 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
1b560 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1b570 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
1b580 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1b590 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
1b5a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1b5b0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1b5c0 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
1b5d0 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
1b5e0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
1b5f0 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
1b600 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
1b610 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
1b620 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
1b630 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
1b640 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
1b650 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
1b660 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
1b670 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
1b680 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
1b690 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
1b6a0 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  2 SQLITE_NOINLIN
1b6b0 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  E serialGet(.  c
1b6c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b6d0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
1b6e0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
1b6f0 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
1b700 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b720 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
1b730 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
1b740 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b760 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
1b770 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
1b780 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
1b790 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1b7a0 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
1b7b0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1b7c0 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
1b7d0 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
1b7e0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
1b7f0 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
1b800 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
1b810 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
1b820 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
1b830 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
1b840 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1b850 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
1b860 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
1b870 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1b880 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
1b890 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1b8a0 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
1b8b0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1b8c0 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
1b8d0 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
1b8e0 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
1b8f0 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
1b900 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
1b910 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
1b920 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
1b930 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
1b940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1b950 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
1b960 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
1b970 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
1b980 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1b990 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
1b9a0 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
1b9b0 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
1b9c0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
1b9d0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
1b9e0 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
1b9f0 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
1ba00 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
1ba10 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
1ba20 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
1ba30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
1ba40 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
1ba50 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
1ba60 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
1ba70 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
1ba80 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
1ba90 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
1baa0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1bab0 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
1bac0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
1bad0 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
1bae0 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
1baf0 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
1bb00 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
1bb10 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
1bb20 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
1bb30 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
1bb40 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1bb50 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
1bb60 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
1bb70 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
1bb80 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
1bb90 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e  ags = sqlite3IsN
1bba0 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20  aN(pMem->u.r) ? 
1bbb0 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
1bbc0 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eal;.  }.  retur
1bbd0 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  n 8;.}.u32 sqlit
1bbe0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1bbf0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1bc00 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
1bc10 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
1bc20 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
1bc30 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
1bc40 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1bc50 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1bc60 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1bc70 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
1bca0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
1bcb0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
1bcc0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1bcd0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
1bce0 3a 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20  : { /* Internal 
1bcf0 75 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77  use only: NULL w
1bd00 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
1bd10 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1bd20 20 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68   ** UPDATE no-ch
1bd30 61 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f  ange flag set */
1bd40 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1bd50 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  gs = MEM_Null|ME
1bd60 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d  M_Zero;.      pM
1bd70 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
1bd80 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d   pMem->u.nZero =
1bd90 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1bda0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bdb0 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
1bdc0 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
1bdd0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
1bde0 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
1bdf0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1be00 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
1be10 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
1be20 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
1be30 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
1be40 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
1be50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1be60 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
1be70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
1be80 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
1be90 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
1bea0 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
1beb0 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
1bec0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1bed0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
1bee0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1bef0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1bf00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bf10 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1bf20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1bf30 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bf40 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1bf50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1bf60 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1bf70 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
1bf80 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
1bf90 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
1bfa0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1bfb0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1bfc0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1bfd0 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
1bfe0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1bff0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1c000 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1c010 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1c020 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1c030 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
1c040 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1c050 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c060 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1c070 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c080 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
1c090 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1c0a0 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
1c0b0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1c0c0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1c0d0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1c0e0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
1c0f0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1c100 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1c110 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c120 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1c130 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
1c140 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c150 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1c160 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1c170 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1c180 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
1c190 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
1c1a0 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
1c1b0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1c1c0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1c1d0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1c1e0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1c1f0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66  TE_INT(buf);.#if
1c200 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20  def __HP_cc .   
1c210 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e     /* Work aroun
1c220 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69  d a sign-extensi
1c230 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50  on bug in the HP
1c240 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50   compiler for HP
1c250 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  /UX */.      if(
1c260 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70   buf[0]&0x80 ) p
1c270 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66  Mem->u.i |= 0xff
1c280 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c  ffffff80000000LL
1c290 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
1c2a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c2b0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1c2c0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1c2d0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c2e0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
1c2f0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1c300 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c310 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1c320 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
1c330 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
1c340 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
1c350 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
1c360 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1c370 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1c380 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1c390 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
1c3a0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1c3b0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1c3c0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
1c3d0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1c3e0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1c3f0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1c400 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1c410 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
1c420 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
1c430 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1c440 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
1c450 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
1c460 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
1c470 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
1c480 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
1c490 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
1c4a0 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
1c4b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
1c4c0 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
1c4d0 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
1c4e0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
1c4f0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
1c500 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
1c510 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
1c520 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
1c530 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
1c540 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
1c550 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
1c560 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
1c570 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c580 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
1c590 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1c5a0 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
1c5b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c5c0 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
1c5d0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1c5e0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
1c5f0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
1c600 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
1c610 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1c620 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
1c630 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1c640 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1c650 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1c660 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
1c670 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
1c680 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
1c690 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
1c6a0 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
1c6b0 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
1c6c0 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
1c6d0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1c6e0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
1c6f0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
1c700 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
1c710 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
1c720 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1c730 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
1c740 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
1c750 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
1c760 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
1c770 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
1c780 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
1c790 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
1c7a0 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
1c7b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1c7c0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
1c7d0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
1c7e0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
1c7f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c800 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
1c810 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c820 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
1c830 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
1c840 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
1c850 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
1c860 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1c870 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
1c880 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1c890 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
1c8a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1c8b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1c8c0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1c8d0 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
1c8e0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
1c8f0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
1c900 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
1c910 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
1c920 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
1c930 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
1c940 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
1c950 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
1c960 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
1c970 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
1c980 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
1c990 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
1c9a0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
1c9b0 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
1c9c0 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
1c9d0 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
1c9e0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1c9f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1ca00 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
1ca10 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
1ca20 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
1ca30 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
1ca40 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1ca50 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
1ca60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1ca70 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
1ca80 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
1ca90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1caa0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1cab0 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
1cac0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
1cad0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1cae0 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  nfo             
1caf0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1cb00 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
1cb10 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
1cb20 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
1cb30 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1cb40 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
1cb50 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  urn */.  int nBy
1cb60 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1cb80 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
1cb90 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20  ired for *p */. 
1cba0 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
1cbb0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
1cbc0 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
1cbd0 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
1cbe0 3e 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20  >nKeyField+1);. 
1cbf0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1cc00 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1cc10 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1cc20 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1cc30 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1cc40 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  n 0;.  p->aMem =
1cc50 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1cc60 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1cc70 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1cc80 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1cc90 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1cca0 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1ccb0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1ccc0 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1ccd0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
1cce0 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
1ccf0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1cd00 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
1cd10 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
1cd20 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
1cd30 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
1cd40 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
1cd50 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
1cd60 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
1cd70 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
1cd80 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
1cd90 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
1cda0 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
1cdb0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1cdc0 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
1cdd0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1cde0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1cdf0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
1ce00 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
1ce10 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
1ce20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ce30 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
1ce40 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
1ce50 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1ce60 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
1ce70 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
1ce80 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
1ce90 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1cea0 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
1ceb0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1cec0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
1ced0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1cee0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1cef0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
1cf00 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
1cf10 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1cf30 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
1cf40 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1cf50 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1cf80 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1cf90 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
1cfa0 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
1cfb0 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
1cfc0 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
1cfd0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1cfe0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
1cff0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1d000 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1d010 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
1d020 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
1d030 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
1d040 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
1d050 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1d060 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1d070 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1d080 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1d090 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1d0a0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1d0b0 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1d0c0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1d0d0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1d0e0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1d0f0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1d100 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1d110 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1d120 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1d130 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
1d140 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
1d150 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1d160 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
1d170 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
1d180 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28  Mem++;.    if( (
1d190 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20  ++u)>=p->nField 
1d1a0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61  ) break;.  }.  a
1d1b0 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
1d1c0 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1d1d0 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
1d1e0 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = u;.}..#ifdef 
1d1f0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1d200 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d210 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1d220 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1d230 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1d240 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1d250 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1d260 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1d270 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1d280 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1d290 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1d2a0 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1d2b0 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1d2c0 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1d2d0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1d2e0 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1d2f0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1d300 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1d310 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1d320 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1d330 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1d340 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1d350 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1d360 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d370 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1d380 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1d390 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1d3a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1d3b0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1d3c0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1d3d0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1d3e0 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1d3f0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1d400 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1d410 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1d420 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1d430 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1d440 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1d450 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1d460 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1d470 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1d480 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1d490 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1d4a0 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1d4b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1d4c0 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1d4d0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1d4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1d4f0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1d500 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1d510 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1d520 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1d530 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1d540 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1d550 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1d560 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1d570 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d580 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1d590 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1d5a0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1d5b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1d5c0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1d5d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d5e0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1d5f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1d600 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1d610 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1d620 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1d630 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1d640 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1d650 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1d660 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1d670 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1d680 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1d690 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1d6a0 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1d6b0 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1d6c0 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1d6d0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1d6e0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1d6f0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1d700 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1d710 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1d720 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1d730 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1d740 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1d750 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1d760 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1d770 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1d780 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1d790 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1d7a0 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1d7b0 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1d7c0 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1d7d0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1d7e0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1d7f0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1d800 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1d810 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1d820 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1d830 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1d840 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1d850 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1d860 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1d870 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1d880 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1d890 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1d8a0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1d8b0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1d8c0 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1d8d0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1d8e0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1d8f0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1d900 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1d910 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1d920 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1d930 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1d940 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1d950 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1d960 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1d970 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1d980 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1d990 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1d9a0 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
1d9b0 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52  ->nField || CORR
1d9c0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1d9d0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
1d9e0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1d9f0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1da00 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29  o->nKeyField>0 )
1da10 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1da20 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1da30 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1da40 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1da50 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
1da60 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
1da70 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
1da80 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
1da90 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
1daa0 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
1dab0 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
1dac0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
1dad0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
1dae0 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
1daf0 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
1db00 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
1db10 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
1db20 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
1db30 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1db40 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
1db50 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
1db60 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
1db70 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1db80 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
1db90 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
1dba0 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
1dbb0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
1dbc0 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
1dbd0 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
1dbe0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
1dbf0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1dc00 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
1dc10 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
1dc20 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
1dc30 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
1dc40 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1dc50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1dc60 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1dc70 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
1dc80 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
1dc90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1dca0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1dcb0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
1dcc0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
1dcd0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1dce0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1dcf0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1dd00 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
1dd10 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
1dd20 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
1dd30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dd40 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
1dd50 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
1dd60 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
1dd70 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
1dd80 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1dd90 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1dda0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1ddb0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1ddc0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
1ddd0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1dde0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1ddf0 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
1de00 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
1de10 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
1de20 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
1de30 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
1de40 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
1de50 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
1de60 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
1de70 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1de80 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
1de90 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1dea0 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1deb0 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1dec0 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1ded0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1dee0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1def0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1df00 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1df10 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1df20 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1df30 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1df40 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1df50 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
1df60 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1df70 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1df80 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1df90 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
1dfa0 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1dfb0 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1dfc0 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1dfd0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1dfe0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1dff0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1e000 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1e010 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
1e020 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
1e030 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
1e040 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1e050 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
1e060 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1e070 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
1e080 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
1e090 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1e0a0 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
1e0b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1e0c0 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1e0d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1e0e0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1e0f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1e100 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1e110 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1e120 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1e130 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1e140 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1e150 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1e160 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1e170 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1e180 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1e190 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1e1a0 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1e1b0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1e1c0 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1e1d0 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  by pKeyInfo->nAl
1e1e0 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  lField..**.** If
1e1f0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1e200 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
1e210 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  d, it means that
1e220 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a   the high-speed.
1e230 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  ** vdbeRecordCom
1e240 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64  pareInt() and vd
1e250 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1e260 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73  tring() routines
1e270 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
1e280 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66  k correctly.  If
1e290 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65   this assert() e
1e2a0 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72  ver fires, it pr
1e2b0 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20  obably means.** 
1e2c0 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f  that the KeyInfo
1e2d0 2e 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65  .nKeyField or Ke
1e2e0 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
1e2f0 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1e300 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1e310 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1e320 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1e330 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1e340 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1e350 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1e360 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1e370 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1e380 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1e390 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1e3a0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1e3b0 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1e3c0 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1e3d0 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1e3e0 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1e3f0 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1e400 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1e410 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1e420 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1e430 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1e440 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1e450 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1e460 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1e470 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1e480 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1e490 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1e4a0 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1e4b0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1e4c0 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1e4d0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1e4e0 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1e4f0 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1e500 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1e510 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1e520 41 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  AllField );.}.#e
1e530 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1e540 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1e550 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1e560 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1e570 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1e580 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1e590 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1e5a0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1e5b0 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1e5c0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1e5d0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1e5e0 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1e5f0 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1e600 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1e610 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1e620 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1e630 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1e640 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1e650 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1e660 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1e670 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1e680 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1e690 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1e6a0 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1e6b0 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1e6c0 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1e6d0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1e6e0 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1e6f0 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1e700 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1e710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1e720 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1e730 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1e740 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1e750 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1e760 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1e770 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1e780 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1e790 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1e7a0 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1e7b0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1e7c0 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1e7d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1e7e0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1e7f0 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1e800 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1e810 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1e820 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1e830 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1e840 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d   *v1, *v2;.    M
1e850 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1e860 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1e870 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1e880 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1e890 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1e8a0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1e8b0 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1e8c0 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1e8d0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1e8e0 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1e8f0 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1e900 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1e910 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1e920 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1e930 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1e940 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1e950 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1e960 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1e970 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
1e980 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1e990 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
1e9a0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69  oll->enc);.    i
1e9b0 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1e9c0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =0) ){.      if(
1e9d0 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1e9e0 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1e9f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20  _BKPT;.      rc 
1ea00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1ea10 20 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c        rc = pColl
1ea20 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1ea30 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63  ser, c1.n, v1, c
1ea40 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a  2.n, v2);.    }.
1ea50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ea60 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
1ea70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ea80 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
1ea90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1eaa0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
1eab0 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67  input pBlob is g
1eac0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1ead0 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e  a Blob that is n
1eae0 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74  ot marked.** wit
1eaf0 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74  h MEM_Zero.  Ret
1eb00 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
1eb10 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62  ould be a zero-b
1eb20 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lob..*/.static i
1eb30 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e  nt isAllZero(con
1eb40 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1eb50 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  n){.  int i;.  f
1eb60 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
1eb70 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20  ){.    if( z[i] 
1eb80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1eb90 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1eba0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1ebb0 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1ebc0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1ebd0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1ebe0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1ebf0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1ec00 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1ec10 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1ec20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1ec30 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1ec40 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1ec50 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1ec60 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1ec70 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45  essor..*/.SQLITE
1ec80 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1ec90 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1eca0 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1ecb0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1ecc0 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
1ecd0 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20   n1 = pB1->n;.  
1ece0 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b  int n2 = pB2->n;
1ecf0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73  ..  /* It is pos
1ed00 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20  sible to have a 
1ed10 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20  Blob value that 
1ed20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72  has some non-zer
1ed30 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66  o content.  ** f
1ed40 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
1ed50 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68  content.  But th
1ed60 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70  at only comes up
1ed70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65   for Blobs forme
1ed80 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50  d.  ** by the OP
1ed90 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1eda0 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f  de, and such Blo
1edb0 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73  bs never get pas
1edc0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
1edd0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1ede0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
1edf0 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB1->flags & ME
1ee00 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31  M_Zero)==0 || n1
1ee10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1ee20 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB2->flags & M
1ee30 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1ee40 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  2==0 );..  if( (
1ee50 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e  pB1->flags|pB2->
1ee60 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72  flags) & MEM_Zer
1ee70 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31  o ){.    if( pB1
1ee80 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66  ->flags & pB2->f
1ee90 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1eea0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eeb0 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70  pB1->u.nZero - p
1eec0 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1eed0 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e   }else if( pB1->
1eee0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1eef0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
1ef00 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c  sAllZero(pB2->z,
1ef10 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB2->n) ) retur
1ef20 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1ef30 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1ef40 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  - n2;.    }else{
1ef50 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1ef60 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42  lZero(pB1->z, pB
1ef70 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b  1->n) ) return +
1ef80 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1ef90 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72  n1 - pB2->u.nZer
1efa0 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  o;.    }.  }.  c
1efb0 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1efc0 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20  , pB2->z, n1>n2 
1efd0 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66  ? n2 : n1);.  if
1efe0 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1eff0 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32    return n1 - n2
1f000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1f010 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
1f020 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  en a 64-bit sign
1f030 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61  ed integer and a
1f040 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1f050 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72  -point.** number
1f060 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1f070 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1f080 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1f090 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73  st (i64) is less
1f0a0 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20   than,.** equal 
1f0b0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1f0c0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28  han the second (
1f0d0 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  double)..*/.stat
1f0e0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
1f0f0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36  tFloatCompare(i6
1f100 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a  4 i, double r){.
1f110 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e    if( sizeof(LON
1f120 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20  GDOUBLE_TYPE)>8 
1f130 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  ){.    LONGDOUBL
1f140 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47  E_TYPE x = (LONG
1f150 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20  DOUBLE_TYPE)i;. 
1f160 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74     if( x<r ) ret
1f170 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1f180 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  x>r ) return +1;
1f190 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1f1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1f1b0 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b  y;.    double s;
1f1c0 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33  .    if( r<-9223
1f1d0 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e  372036854775808.
1f1e0 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  0 ) return +1;. 
1f1f0 20 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37     if( r>=922337
1f200 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1f210 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1f220 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20   y = (i64)r;.   
1f230 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72   if( i<y ) retur
1f240 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e  n -1;.    if( i>
1f250 79 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  y ) return +1;. 
1f260 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69     s = (double)i
1f270 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20  ;.    if( s<r ) 
1f280 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1f290 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20  f( s>r ) return 
1f2a0 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1f2b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1f2c0 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
1f2d0 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
1f2e0 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
1f2f0 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
1f300 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
1f310 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1f320 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1f330 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1f340 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
1f350 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
1f360 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
1f370 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
1f380 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
1f390 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
1f3a0 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
1f3b0 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
1f3c0 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
1f3d0 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
1f3e0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
1f3f0 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
1f400 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
1f410 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
1f420 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
1f430 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1f440 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
1f450 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1f460 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1f470 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
1f480 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
1f490 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
1f4a0 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
1f4b0 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
1f4c0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
1f4d0 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
1f4e0 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
1f4f0 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
1f500 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
1f510 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21  |f2;.  assert( !
1f520 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73  sqlite3VdbeMemIs
1f530 52 6f 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26  RowSet(pMem1) &&
1f540 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d   !sqlite3VdbeMem
1f550 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20  IsRowSet(pMem2) 
1f560 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
1f570 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
1f580 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1f590 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
1f5a0 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
1f5b0 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
1f5c0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
1f5d0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1f5e0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
1f5f0 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
1f600 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
1f610 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
1f620 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
1f630 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61   two values is a
1f640 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69   number.  */.  i
1f650 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1f660 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1f670 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  eal) ){.    if( 
1f680 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1f690 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1f6a0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1f6b0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1f6c0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1f6d0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1f6e0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1f6f0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1f700 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1f710 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1f720 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b   MEM_Real)!=0 ){
1f730 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1f740 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.r < pMem2->u
1f750 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .r ) return -1;.
1f760 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1f770 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r > pMem2->u.
1f780 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1f790 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1f7a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1f7b0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1f7c0 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1f7d0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1f7e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1f7f0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1f800 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20  are(pMem1->u.i, 
1f810 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem2->u.r);.   
1f820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f830 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1f840 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f850 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
1f860 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1f870 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1f880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1f890 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c  rn -sqlite3IntFl
1f8a0 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32  oatCompare(pMem2
1f8b0 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e  ->u.i, pMem1->u.
1f8c0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1f8d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f8e0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1f8f0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b  }.    return +1;
1f900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1f910 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
1f920 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ing and the othe
1f930 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  r is a blob, the
1f940 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e   string is less.
1f950 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1f960 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61  e strings, compa
1f970 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  re using the col
1f980 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
1f990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1f9a0 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1f9b0 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Str ){.    if( (
1f9c0 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f1 & MEM_Str)==0
1f9d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f9e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1f9f0 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f2 & MEM_Str)
1fa00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1fa10 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1fa20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1fa30 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e  ->enc==pMem2->en
1fa40 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e  c || pMem1->db->
1fa50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1fa60 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1fa70 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1fa80 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1fa90 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1faa0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1fab0 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1fac0 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1fad0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1fae0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1faf0 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1fb00 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1fb10 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1fb20 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1fb30 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1fb40 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1fb50 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1fb60 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1fb70 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1fb80 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1fb90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1fba0 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1fbb0 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1fbc0 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1fbd0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1fbe0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1fbf0 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1fc00 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1fc10 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1fc20 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1fc30 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1fc40 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1fc50 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1fc60 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1fc70 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1fc80 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1fc90 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1fca0 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1fcb0 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1fcc0 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1fcd0 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1fce0 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1fcf0 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1fd00 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1fd10 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1fd20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1fd30 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1fd40 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1fd50 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1fd60 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1fd70 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1fd80 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1fd90 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1fda0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1fdb0 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1fdc0 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1fdd0 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1fde0 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1fdf0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1fe00 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1fe10 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1fe20 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1fe30 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1fe40 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1fe50 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1fe60 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1fe70 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1fe80 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1fe90 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1fea0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1feb0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1fec0 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1fed0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1fee0 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1fef0 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1ff00 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1ff10 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1ff20 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1ff30 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1ff40 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1ff50 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1ff60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ff70 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1ff80 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1ff90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ffa0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1ffb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1ffc0 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1ffd0 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1ffe0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fff0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
20000 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
20010 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
20020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
20030 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
20040 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
20050 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20060 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
20070 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
20080 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20090 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
200a0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
200b0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
200c0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
200d0 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
200e0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
200f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20100 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
20110 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
20120 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
20130 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
20140 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
20150 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
20160 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
20170 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
20180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
20190 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
201a0 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
201b0 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
201c0 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
201d0 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
201e0 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
201f0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
20200 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
20210 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
20220 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
20230 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
20240 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
20250 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
20260 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
20270 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
20280 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
20290 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
202a0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
202b0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
202c0 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
202d0 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
202e0 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
202f0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
20300 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
20310 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
20320 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
20330 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
20340 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
20350 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
20360 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
20370 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
20380 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
20390 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
203a0 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
203b0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
203c0 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
203d0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
203e0 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
203f0 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
20400 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
20410 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
20420 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
20430 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
20440 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
20450 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
20460 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
20470 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
20480 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
20490 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
204a0 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
204b0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
204c0 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
204d0 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
204e0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
204f0 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
20500 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
20510 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
20520 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
20530 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
20540 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
20550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20560 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20570 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
20580 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
20590 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
205a0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
205b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
205c0 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
205d0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
205e0 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
20610 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20620 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
20650 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
20660 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
20670 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
206a0 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
206b0 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
206c0 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
206f0 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
20700 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
20730 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
20740 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
20750 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20770 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
20780 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
20790 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
207a0 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
207b0 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
207c0 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
207d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
207e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
207f0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
20800 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
20810 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
20820 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
20830 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
20840 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
20850 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
20860 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
20870 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
20880 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
20890 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
208a0 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
208b0 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
208c0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
208d0 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
208e0 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
208f0 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
20900 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
20910 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
20920 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
20930 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
20940 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
20950 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
20960 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
20970 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
20980 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
20990 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
209a0 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
209b0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
209c0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
209d0 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
209e0 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
209f0 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
20a00 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
20a10 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
20a20 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
20a30 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
20a40 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
20a50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
20a60 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
20a70 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
20a80 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
20a90 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
20aa0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
20ab0 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
20ac0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
20ad0 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70  fo->nAllField>=p
20ae0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20  PKey2->nField . 
20af0 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
20b00 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
20b10 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20b20 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
20b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20b40 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20b50 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20  nKeyField>0 );. 
20b60 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
20b70 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
20b80 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
20b90 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
20ba0 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
20bb0 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
20bc0 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
20bd0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
20be0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
20bf0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
20c00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20c10 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
20c20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
20c30 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
20c40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
20c50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20c60 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
20c70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20c80 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
20c90 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
20ca0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==7 ){.        s
20cb0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
20cc0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
20cd0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
20ce0 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m1);.        rc 
20cf0 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  = -sqlite3IntFlo
20d00 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e  atCompare(pRhs->
20d10 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a  u.i, mem1.u.r);.
20d20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20d30 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76       i64 lhs = v
20d40 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
20d50 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  nt(serial_type, 
20d60 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20  &aKey1[d1]);.   
20d70 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70       i64 rhs = p
20d80 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
20d90 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b    if( lhs<rhs ){
20da0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20db0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
20dc0 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b  e if( lhs>rhs ){
20dd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20de0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
20df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20e00 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20   /* RHS is real 
20e10 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
20e20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
20e30 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
20e40 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
20e50 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
20e60 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
20e70 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
20e80 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20  /* Serial types 
20e90 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72  12 or greater ar
20ea0 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  e strings and bl
20eb0 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61  obs (greater tha
20ec0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  n.        ** num
20ed0 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20  bers). Types 10 
20ee0 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65  and 11 are curre
20ef0 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66  ntly "reserved f
20f00 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20  or future .     
20f10 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69     ** use", so i
20f20 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79  t doesn't really
20f30 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
20f40 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
20f50 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  aring.        **
20f60 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69   them to numberi
20f70 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a  c values are.  *
20f80 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  /.        rc = +
20f90 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
20fa0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
20fb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
20fc0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
20fd0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
20fe0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
20ff0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
21000 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
21010 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
21020 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
21030 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d           if( mem
21040 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20  1.u.r<pRhs->u.r 
21050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
21060 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
21070 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
21080 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r>pRhs->u.r )
21090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
210a0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
210b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
210c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
210d0 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
210e0 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69  Compare(mem1.u.i
210f0 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20  , pRhs->u.r);.  
21100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21110 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
21120 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
21130 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
21140 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
21150 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
21160 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
21170 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
21180 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
21190 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
211a0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
211b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
211c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
211d0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
211e0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
211f0 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
21200 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
21210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21220 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
21230 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
21240 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
21250 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
21260 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
21270 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
21280 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
21290 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
212a0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
212b0 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
212c0 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
212d0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
212e0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
212f0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
21300 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
21340 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
21350 66 28 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70  f( (pKeyInfo = p
21360 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
21370 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
21380 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
21390 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
213a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
213b0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
213c0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
213d0 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
213e0 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
213f0 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
21400 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
21410 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
21420 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
21440 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
21450 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
21460 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
21470 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
21480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21490 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
214a0 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
214b0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
214c0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
214d0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
214e0 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
214f0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
21500 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
21510 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
21520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21530 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
21540 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
21550 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
21560 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
21570 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68      assert( (pRh
21580 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  s->flags & MEM_Z
21590 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d  ero)==0 || pRhs-
215a0 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67  >n==0 );.      g
215b0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
215c0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
215d0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
215e0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
215f0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
21600 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
21610 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  12 || (serial_ty
21620 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
21630 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
21640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21650 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28      int nStr = (
21660 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
21670 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
21680 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
21690 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  r)==(unsigned)nK
216a0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
216b0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
216c0 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  r+1)==(unsigned)
216d0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
216e0 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e   if( (d1+nStr) >
216f0 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
21700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
21710 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
21720 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
21730 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
21740 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
21760 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
21770 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
21780 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
21790 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20  _Zero ){.       
217a0 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
217b0 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  o((const char*)&
217c0 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20  aKey1[d1],nStr) 
217d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
217e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
217f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21800 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20      rc = nStr - 
21810 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRhs->u.nZero;. 
21820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21840 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
21850 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e  IN(nStr, pRhs->n
21860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
21870 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
21880 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
21890 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
218a0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
218b0 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a  nStr - pRhs->n;.
218c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
218d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
218e0 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20  RHS is null */. 
218f0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73     else{.      s
21900 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
21910 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
21920 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  rc = (serial_typ
21930 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e!=0);.    }..  
21940 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
21950 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
21960 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
21970 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
21980 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
21990 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
219a0 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
219b0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
219c0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
219d0 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73   rc) );.      as
219e0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
219f0 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
21a00 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
21a10 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
21a20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
21a30 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70  ++;.    if( i==p
21a40 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20  PKey2->nField ) 
21a50 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b  break;.    pRhs+
21a60 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
21a70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
21a80 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
21a90 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
21aa0 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
21ab0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
21ac0 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
21ad0 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
21ae0 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
21af0 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
21b00 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
21b10 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
21b20 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
21b30 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
21b40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21b50 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
21b60 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
21b70 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
21b80 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
21b90 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
21ba0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
21bb0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
21bc0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21bd0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
21be0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
21bf0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
21c00 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
21c10 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
21c20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
21c30 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
21c40 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
21c50 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
21c60 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
21c70 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
21c80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
21c90 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
21ca0 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
21cb0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
21cc0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21cd0 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
21ce0 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
21cf0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
21d00 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
21d10 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79  led.  );.  pPKey
21d20 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
21d30 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
21d40 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
21d50 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
21d60 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
21d70 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
21d80 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
21d90 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
21da0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
21db0 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
21dc0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
21dd0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
21de0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21df0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
21e00 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
21e10 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
21e20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21e30 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
21e40 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
21e50 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
21e60 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
21e70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
21e80 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
21e90 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
21ea0 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
21eb0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
21ec0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21ed0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
21ee0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
21ef0 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
21f00 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
21f10 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
21f20 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
21f30 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
21f40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21f50 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
21f60 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
21f70 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
21f80 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
21f90 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
21fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
21fb0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21fc0 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
21fd0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
21fe0 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
21ff0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
22000 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
22010 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
22020 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
22030 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
22040 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
22050 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
22060 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
22070 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
22080 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
22090 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
220a0 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
220b0 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20  .  i64 v;.  i64 
220c0 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65  lhs;..  vdbeAsse
220d0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
220e0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
220f0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
22100 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  KeyInfo);.  asse
22110 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
22120 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
22130 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
22140 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
22150 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
22160 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
22170 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
22180 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
22190 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
221a0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
221b0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
221c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
221d0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
221e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
221f0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
22200 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
22210 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22220 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
22230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22240 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
22250 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
22260 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
22270 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
22280 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
22290 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
222a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
222b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
222c0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
222d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
222e0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
222f0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
22300 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
22310 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
22320 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
22330 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
22340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
22350 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
22360 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
22370 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
22380 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
22390 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
223a0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
223b0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
223c0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
223d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
223e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
223f0 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
22400 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
22410 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
22420 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
22430 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
22440 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
22450 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
22460 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
22470 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
22480 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
22490 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
224a0 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
224b0 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
224c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
224d0 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
224e0 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
224f0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
22500 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
22510 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
22520 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
22530 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
22540 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
22550 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
22560 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
22570 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
22580 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
22590 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
225a0 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
225b0 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
225c0 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
225d0 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
225e0 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
225f0 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
22600 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
22610 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
22620 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
22630 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
22640 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
22650 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
22660 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
22670 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
22680 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
22690 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
226a0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
226b0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
226c0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
226d0 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
226e0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
226f0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
22700 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
22710 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22720 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70  2);.  }..  v = p
22730 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
22740 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20  .i;.  if( v>lhs 
22750 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
22760 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
22770 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
22780 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22790 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
227a0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
227b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
227c0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
227d0 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
227e0 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
227f0 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
22800 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
22810 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
22820 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22830 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
22840 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
22850 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
22860 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
22870 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
22880 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
22890 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
228a0 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
228b0 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
228c0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
228d0 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
228e0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
228f0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
22900 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71  ;.    pPKey2->eq
22910 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Seen = 1;.  }.. 
22920 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
22930 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
22940 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
22950 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
22960 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
22970 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22980 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
22990 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
229a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
229b0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
229c0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
229d0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
229e0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
229f0 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
22a00 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
22a10 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
22a20 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
22a30 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
22a40 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
22a50 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
22a60 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
22a70 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
22a80 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
22a90 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
22aa0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
22ab0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
22ac0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
22ad0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
22ae0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22af0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
22b00 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
22b10 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
22b20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
22b30 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
22b40 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
22b50 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
22b60 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  rt( pPKey2->aMem
22b70 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [0].flags & MEM_
22b80 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73  Str );.  vdbeAss
22b90 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
22ba0 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
22bb0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
22bc0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74  pKeyInfo);.  get
22bd0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
22be0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
22bf0 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
22c00 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
22c10 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
22c20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
22c30 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
22c40 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
22c50 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
22c60 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
22c70 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
22c80 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
22c90 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
22ca0 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
22cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
22cc0 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
22cd0 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
22ce0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
22cf0 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
22d00 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
22d10 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
22d20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
22d30 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
22d40 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
22d50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22d60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
22d70 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
22d80 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
22d90 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
22da0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
22db0 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
22dc0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
22dd0 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
22de0 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
22df0 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
22e00 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
22e10 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
22e20 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
22e30 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
22e40 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
22e50 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
22e60 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
22e70 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22e80 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
22e90 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22ea0 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
22eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22ec0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22ed0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
22ee0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
22ef0 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
22f00 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
22f10 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
22f20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
22f30 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
22f40 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
22f50 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
22f60 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
22f70 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
22f80 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22f90 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
22fa0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
22fb0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
22fc0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
22fd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
22fe0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
22ff0 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
23000 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
23010 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
23020 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
23030 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23040 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
23050 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
23060 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23070 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
23080 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
23090 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
230a0 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
230b0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
230c0 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
230d0 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
230e0 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
230f0 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
23100 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
23110 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
23120 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
23130 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
23140 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
23150 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
23160 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
23170 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
23180 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
23190 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
231a0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
231b0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
231c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
231d0 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
231e0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
231f0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
23200 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
23210 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
23220 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
23230 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
23240 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
23250 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
23260 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
23270 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
23280 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
23290 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
232a0 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
232b0 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
232c0 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
232d0 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
232e0 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
232f0 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
23300 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
23310 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
23320 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
23330 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
23340 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
23350 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
23360 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
23370 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
23380 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
23390 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
233a0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
233b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
233c0 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
233d0 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
233e0 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
233f0 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
23400 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
23410 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
23420 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
23430 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
23440 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
23450 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
23460 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
23470 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
23480 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  p->pKeyInfo->nAl
23490 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20  lField<=13 ){.  
234a0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
234b0 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
234c0 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
234d0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
234e0 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
234f0 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
23500 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
23510 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
23520 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
23530 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
23540 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
23550 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
23560 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
23570 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
23580 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
23590 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
235a0 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
235b0 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
235c0 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
235d0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
235e0 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
235f0 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
23600 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
23610 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
23620 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
23630 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
23640 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
23650 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
23660 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
23670 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
23680 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
23690 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
236a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
236b0 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
236c0 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
236d0 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
236e0 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
236f0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
23700 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
23710 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
23720 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
23730 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
23740 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
23750 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
23760 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
23770 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
23780 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
23790 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
237a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
237b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
237c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
237d0 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
237e0 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
237f0 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
23800 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
23810 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
23820 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
23830 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
23840 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
23850 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
23860 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
23870 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
23880 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
23890 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
238a0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
238b0 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
238c0 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
238d0 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
238e0 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
238f0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
23900 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
23910 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
23920 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
23930 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
23940 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
23950 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
23960 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
23970 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
23980 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
23990 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
239a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
239b0 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
239c0 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
239d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
239e0 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
239f0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
23a00 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
23a10 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
23a20 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
23a30 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
23a40 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
23a50 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
23a60 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
23a70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
23a80 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
23a90 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
23aa0 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
23ab0 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
23ac0 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
23ad0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
23ae0 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
23af0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
23b00 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
23b10 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
23b20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
23b30 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
23b40 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
23b50 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
23b60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
23b70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
23b80 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
23b90 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
23ba0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
23bb0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
23bc0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
23bd0 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
23be0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
23bf0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
23c00 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 74  zHdr==m.n );.  t
23c10 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3e 30  estcase( szHdr>0
23c20 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20 61  x7fffffff );.  a
23c30 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20 29 3b  ssert( m.n>=0 );
23c40 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
23c50 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48 64 72  szHdr<3 || szHdr
23c60 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e 29 20  >(unsigned)m.n) 
23c70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
23c80 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
23c90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
23ca0 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
23cb0 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
23cc0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
23cd0 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
23ce0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
23cf0 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
23d00 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
23d10 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
23d20 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
23d30 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
23d40 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
23d50 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
23d60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
23d70 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
23d80 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23d90 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
23da0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
23db0 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
23dc0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
23dd0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
23de0 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
23df0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23e00 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
23e10 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
23e20 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
23e30 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
23e40 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
23e50 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
23e60 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
23e70 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
23e80 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
23e90 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c  id = sqlite3Smal
23ea0 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52  lTypeSizes[typeR
23eb0 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73  owid];.  testcas
23ec0 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
23ed0 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
23ee0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
23ef0 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
23f00 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
23f10 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
23f20 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
23f30 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
23f40 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
23f50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
23f60 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
23f70 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
23f80 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
23f90 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
23fa0 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
23fb0 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
23fc0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23fd0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
23fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
23ff0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
24000 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
24010 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
24020 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
24030 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
24040 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
24050 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
24060 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
24070 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
24080 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
24090 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20  ( m.szMalloc!=0 
240a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
240b0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
240c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
240d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
240e0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
240f0 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
24100 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
24110 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
24120 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
24130 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
24140 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
24150 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
24160 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
24170 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
24180 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
24190 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
241a0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
241b0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
241c0 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
241d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
241e0 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
241f0 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
24200 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
24210 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
24220 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
24230 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
24240 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
24250 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
24260 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
24270 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
24280 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
24290 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
242a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
242b0 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
242c0 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
242d0 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
242e0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
242f0 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
24300 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
24310 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
24320 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  mpare(.  sqlite3
24330 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
24340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
24350 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
24360 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
24370 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
24380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
24390 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
243a0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
243b0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
243c0 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a  packed,       /*
243d0 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
243e0 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  n of key */.  in
243f0 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24410 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
24420 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
24430 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
24440 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
24450 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
24460 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d  r *pCur;.  Mem m
24470 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ;..  assert( pC-
24480 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
24490 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
244a0 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  ur = pC->uc.pCur
244b0 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73  sor;.  assert( s
244c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
244d0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
244e0 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
244f0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
24500 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
24510 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
24520 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
24530 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
24540 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
24550 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74  he way.  ** that
24560 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
24570 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
24580 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
24590 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
245a0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
245b0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
245c0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
245d0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
245e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
245f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
24600 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
24610 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
24620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
24630 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
24640 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
24650 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66  llKey, &m);.  if
24660 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
24670 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65  rn rc;.  }.  *re
24680 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
24690 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
246a0 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  Skip(m.n, m.z, p
246b0 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20  Unpacked, 0);.  
246c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
246d0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
246e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
246f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
24700 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
24710 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
24720 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
24730 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
24740 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
24750 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
24760 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
24770 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
24780 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
24790 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
247a0 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
247b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
247c0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
247d0 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
247e0 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
247f0 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
24800 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
24810 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
24820 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
24830 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
24840 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
24850 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
24860 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
24870 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
24880 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
24890 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
248a0 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
248b0 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
248c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
248d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
248e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
248f0 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
24900 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
24910 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
24920 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
24930 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
24940 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
24950 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
24960 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
24970 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
24980 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
24990 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
249a0 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
249b0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
249c0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
249d0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
249e0 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
249f0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
24a00 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
24a10 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
24a20 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
24a30 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
24a40 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a   obsolete..**.**
24a50 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c 20   If iCode is 1, 
24a60 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e 20  then expiration 
24a70 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54 68  is advisory.  Th
24a80 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f 75  e statement shou
24a90 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70 61  ld.** be reprepa
24aa0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
24ab0 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74 20   restarted, but 
24ac0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
24ad0 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20 69   running.** it i
24ae0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75 6e  s allowed to run
24af0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a   to completion..
24b00 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c 79  **.** Internally
24b10 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
24b20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56 64  just sets the Vd
24b30 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67 20  be.expired flag 
24b40 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61 72  on all.** prepar
24b50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ed statements.  
24b60 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  The flag is set 
24b70 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d 65  to 1 for an imme
24b80 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f 6e  diate expiration
24b90 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20 32  .** and set to 2
24ba0 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72 79   for an advisory
24bb0 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f 0a   expiration..*/.
24bc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
24bd0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
24be0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
24bf0 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20  , int iCode){.  
24c00 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
24c10 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
24c20 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
24c30 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 69    p->expired = i
24c40 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Code+1;.  }.}../
24c50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24c60 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
24c70 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
24c80 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
24c90 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
24ca0 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
24cb0 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
24cc0 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49 54  Return the SQLIT
24cd0 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73 20  E_PREPARE flags 
24ce0 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a 75  for a Vdbe..*/.u
24cf0 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  8 sqlite3VdbePre
24d00 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20 2a  pareFlags(Vdbe *
24d10 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
24d20 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f 2a  prepFlags;.}../*
24d30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24d40 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
24d50 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
24d60 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
24d70 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
24d80 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
24d90 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
24da0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
24db0 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
24dc0 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
24dd0 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
24de0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
24df0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
24e00 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
24e10 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
24e20 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
24e30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
24e40 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
24e50 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
24e60 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
24e70 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
24e80 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
24e90 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
24ea0 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
24eb0 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62  etBoundValue(Vdb
24ec0 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
24ed0 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
24ee0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
24ef0 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
24f00 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
24f10 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61 73  [iVar-1];.    as
24f20 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66 6c  sert( (v->db->fl
24f30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61  ags & SQLITE_Ena
24f40 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a 20  bleQPSG)==0 );. 
24f50 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
24f60 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
24f70 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
24f80 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
24f90 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
24fa0 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
24fb0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
24fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
24fd0 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
24fe0 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
24ff0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
25000 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
25010 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
25020 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
25030 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
25040 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25050 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
25060 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
25070 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
25080 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
25090 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
250a0 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
250b0 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
250c0 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
250d0 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
250e0 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
250f0 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
25100 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
25110 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
25120 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
25130 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
25140 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 61  t( iVar>0 );.  a
25150 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
25160 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
25170 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
25180 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20 29    if( iVar>=32 )
25190 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
251a0 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b 0a   |= 0x80000000;.
251b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
251c0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
251d0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
251e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  .  }.}../*.** Ca
251f0 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  use a function t
25200 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  o throw an error
25210 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c 20   if it was call 
25220 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e 63  from OP_PureFunc
25230 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
25240 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  OP_Function..**.
25250 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20 6d  ** OP_PureFunc m
25260 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 75  eans that the fu
25270 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 64  nction must be d
25280 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61 6e  eterministic, an
25290 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72 6f  d should.** thro
252a0 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74  w an error if it
252b0 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74 73   is given inputs
252c0 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65   that would make
252d0 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   it non-determin
252e0 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20 72  istic..** This r
252f0 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
25300 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20 66  d by date/time f
25310 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
25320 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  e non-determinis
25330 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73 20  tic.** features 
25340 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a 2a  such as 'now'..*
25350 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f 74  /.int sqlite3Not
25360 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65 33  PureFunc(sqlite3
25370 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
25380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25390 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
253a0 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78 2d  TAT4.  if( pCtx-
253b0 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74 75  >pVdbe==0 ) retu
253c0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69  rn 1;.#endif.  i
253d0 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d 3e  f( pCtx->pVdbe->
253e0 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e 6f  aOp[pCtx->iOp].o
253f0 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46 75  pcode==OP_PureFu
25400 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
25410 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
25420 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e 6f  Ctx, .       "no
25430 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
25440 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64 65  function in inde
25450 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20  x expression or 
25460 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
25470 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a 20  ",.       -1);. 
25480 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
25490 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
254a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
254b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
254c0 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
254d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
254e0 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74  xt from an sqlit
254f0 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20  e3_vtab.zErrMsg 
25500 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
25510 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
25520 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
25530 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56  malloc) into a V
25540 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  dbe.zErrMsg (tex
25550 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
25560 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
25570 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
25580 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  loc)..*/.void sq
25590 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
255a0 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73  rrmsg(Vdbe *p, s
255b0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
255c0 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62  ab){.  if( pVtab
255d0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
255e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
255f0 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->db;.    sqlite
25600 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
25610 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
25620 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
25630 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56  3DbStrDup(db, pV
25640 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
25650 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25660 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
25670 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  .    pVtab->zErr
25680 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  Msg = 0;.  }.}.#
25690 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
256a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
256b0 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
256c0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
256d0 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a  DATE_HOOK../*.**
256e0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
256f0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
25700 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79  ULL, release any
25710 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
25720 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
25730 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
25740 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d  s in the p->aMem
25750 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66  [] array. Also f
25760 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64  ree the Unpacked
25770 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
25780 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e  ure itself, usin
25790 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
257a0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
257b0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
257c0 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52  o free UnpackedR
257d0 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73  ecord structures
257e0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
257f0 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52   the vdbeUnpackR
25800 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
25810 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70   found in vdbeap
25820 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  i.c..*/.static v
25830 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61  oid vdbeFreeUnpa
25840 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  cked(sqlite3 *db
25850 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e  , int nField, Un
25860 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
25870 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
25880 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25890 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69  i=0; i<nField; i
258a0 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  ++){.      Mem *
258b0 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
258c0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  i];.      if( pM
258d0 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  em->zMalloc ) sq
258e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
258f0 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ase(pMem);.    }
25900 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
25910 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d  eeNN(db, p);.  }
25920 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25930 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
25940 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69  DATE_HOOK */..#i
25950 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
25960 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
25970 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  K./*.** Invoke t
25980 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  he pre-update ho
25990 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ok. If this is a
259a0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
259b0 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61  TE pre-update ca
259c0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73  ll,.** then curs
259d0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
259e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
259f0 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f   should point to
25a00 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a   the row about.*
25a10 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f  * to be update o
25a20 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  r deleted. If th
25a30 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61  e application ca
25a40 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75  lls sqlite3_preu
25a50 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20  pdate_old(),.** 
25a60 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c  the required val
25a70 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ue will be read 
25a80 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65  from the row the
25a90 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
25aa0 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
25ab0 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48  e3VdbePreUpdateH
25ac0 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ook(.  Vdbe *v, 
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ae0 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70         /* Vdbe p
25af0 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69  re-update hook i
25b00 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a  s invoked by */.
25b10 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
25b20 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
25b30 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67    /* Cursor to g
25b40 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73  rab old.* values
25b50 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
25b60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
25b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
25b80 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44  LITE_INSERT, UPD
25b90 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f  ATE or DELETE */
25ba0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25bb0 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
25bc0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
25bd0 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ame */.  Table *
25be0 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
25bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69           /* Modi
25c00 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  fied table */.  
25c10 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20  i64 iKey1,      
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c30 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76  /* Initial key v
25c40 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  alue */.  int iR
25c50 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  eg              
25c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
25c70 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20  ister for new.* 
25c80 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73  record */.){.  s
25c90 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e  qlite3 *db = v->
25ca0 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b  db;.  i64 iKey2;
25cb0 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65  .  PreUpdate pre
25cc0 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20  update;.  const 
25cd0 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61  char *zTbl = pTa
25ce0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74  b->zName;.  stat
25cf0 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65  ic const u8 fake
25d00 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a  SortOrder = 0;..
25d10 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50    assert( db->pP
25d20 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20  reUpdate==0 );. 
25d30 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61   memset(&preupda
25d40 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  te, 0, sizeof(Pr
25d50 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28  eUpdate));.  if(
25d60 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d   HasRowid(pTab)=
25d70 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31 20  =0 ){.    iKey1 
25d80 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20  = iKey2 = 0;.   
25d90 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20 3d   preupdate.pPk =
25da0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
25db0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
25dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
25dd0 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54  op==SQLITE_UPDAT
25de0 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 32  E ){.      iKey2
25df0 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d   = v->aMem[iReg]
25e00 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  .u.i;.    }else{
25e10 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 69  .      iKey2 = i
25e20 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key1;.    }.  }.
25e30 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
25e40 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
25e50 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  Col .       || (
25e60 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54  pCsr->nField==pT
25e70 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70  ab->nCol+1 && op
25e80 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
25e90 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29  && iReg==-1).  )
25ea0 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76  ;..  preupdate.v
25eb0 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74   = v;.  preupdat
25ec0 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20  e.pCsr = pCsr;. 
25ed0 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20   preupdate.op = 
25ee0 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  op;.  preupdate.
25ef0 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a  iNewReg = iReg;.
25f00 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
25f10 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70  nfo.db = db;.  p
25f20 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
25f30 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  .enc = ENC(db);.
25f40 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
25f50 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d 20  nfo.nKeyField = 
25f60 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72  pTab->nCol;.  pr
25f70 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
25f80 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
25f90 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  *)&fakeSortOrder
25fa0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
25fb0 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70  ey1 = iKey1;.  p
25fc0 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d  reupdate.iKey2 =
25fd0 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64   iKey2;.  preupd
25fe0 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  ate.pTab = pTab;
25ff0 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ..  db->pPreUpda
26000 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b  te = &preupdate;
26010 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74  .  db->xPreUpdat
26020 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50  eCallback(db->pP
26030 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c  reUpdateArg, db,
26040 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20   op, zDb, zTbl, 
26050 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20  iKey1, iKey2);. 
26060 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20   db->pPreUpdate 
26070 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
26080 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61  Free(db, preupda
26090 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76  te.aRecord);.  v
260a0 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
260b0 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65  db, preupdate.ke
260c0 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b  yinfo.nKeyField+
260d0 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e  1, preupdate.pUn
260e0 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46  packed);.  vdbeF
260f0 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20  reeUnpacked(db, 
26100 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
26110 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70  o.nKeyField+1, p
26120 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70  reupdate.pNewUnp
26130 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72  acked);.  if( pr
26140 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a  eupdate.aNew ){.
26150 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
26160 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e  or(i=0; i<pCsr->
26170 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
26180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
26190 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70  emRelease(&preup
261a0 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20  date.aNew[i]);. 
261b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
261c0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72 65  DbFreeNN(db, pre
261d0 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20  update.aNew);.  
261e0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
261f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
26200 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a        PDATE_HOOK */.