/ Hex Artifact Content
Login

Artifact ded4c9c2e73ae059c57af970d958ec93d9e30e85c3193908d324c0b03d2eb947:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1180: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1190: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
11a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
11b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
11d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1200: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1210: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1220: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1230: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1260: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1270: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1280: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1290: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
12a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
12b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
12c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
12d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
12e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
12f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1300: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1310: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1320: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1330: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1340: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1350: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1360: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1370: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1380: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1390: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
13a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
13b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
13c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
13d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
13e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
13f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1400: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1410: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1420: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1430: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1440: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1450: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1460: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1470: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1480: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1490: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
14b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
14c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
14d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
14e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
14f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1500: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1510: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1520: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1530: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1540: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1550: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1560: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1570: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1580: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1590: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
15a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
15b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
15c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
15d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
15e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
15f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1610: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1620: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1630: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1640: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1650: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1660: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1670: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1680: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1690: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
16a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
16d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
16e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
16f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1700: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1710: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1720: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1730: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1740: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1750: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1760: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1770: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1780: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1790: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
17a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
17b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
17c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
17d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
17e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
17f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1800: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1810: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1830: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1840: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1850: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1860: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1870: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1880: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
18b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
18c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
18d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
18e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
18f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1900: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1910: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1920: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1930: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1940: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1960: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1970: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1980: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1990: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
19a0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
19d0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
19e0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
19f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1a50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1a60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1a70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1a80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1a90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1aa0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1ab0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ad0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1ae0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1af0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1b00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1b50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1b70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1b80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1b90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1bb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1bd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1be0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1bf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1c20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1c30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1c40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1c50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1c60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1c70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1c80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1c90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1cc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ce0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1cf0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1d00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1d10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1d20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1d30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1d40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1d50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1d80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1db0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1dc0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1dd0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1de0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1df0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1e00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1e10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1e20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1e30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1e40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1e50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1e60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1e70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1e80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1e90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1ea0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1eb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ec0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ee0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ef0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1f00: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1f10: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1f20: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1f30: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1f40: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1f50: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
1f60: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
1f70: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
1f80: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
1f90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
1fa0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
1fb0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1fc0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
1fd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1fe0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2000: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2010: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2020: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2030: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2050: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2060: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2070: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2080: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
20b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
20c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
20e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
20f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2100: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2110: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2140: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2150: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2160: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2170: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2180: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
21b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
21c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
21d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
21e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
21f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2200: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2210: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2240: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2260: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2270: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2280: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2290: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
22d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
22e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
22f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2300: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2310: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2320: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2330: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2340: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2350: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2360: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2370: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2380: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
23a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
23d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
23e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
23f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2400: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2410: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
2420: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
2430: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
2440: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
2450: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2460: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2470: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2480: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2490: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24b0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
24c0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
24f0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2500: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2510: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2520: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2530: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2550: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2560: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2570: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2580: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2590: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
25a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
25b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25c0: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
25d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
25e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
25f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2620: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2630: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
2640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
2660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
2680: 75 72 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51  urrent EXPLAIN Q
2690: 55 45 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69  UERY PLAN baseli
26a0: 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22  ne..** 0 means "
26b0: 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  none"..*/.int sq
26c0: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
26d0: 50 61 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50  Parent(Parse *pP
26e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20  arse){.  VdbeOp 
26f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72  *pOp;.  if( pPar
2700: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d  se->addrExplain=
2710: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2720: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2730: 62 65 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e  beGetOp(pParse->
2740: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61  pVdbe, pParse->a
2750: 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72  ddrExplain);.  r
2760: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d  eturn pOp->p2;.}
2770: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65  ../*.** Set a de
2780: 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
2790: 74 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t on the followi
27a0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  ng routine in or
27b0: 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f  der to.** monito
27c0: 72 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  r the EXPLAIN QU
27d0: 45 52 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65  ERY PLAN code ge
27e0: 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  neration..*/.#if
27f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2800: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
2810: 74 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70  te3ExplainBreakp
2820: 6f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  oint(const char 
2830: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
2840: 2a 7a 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31  *z2){.  (void)z1
2850: 3b 0a 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a  ;.  (void)z2;.}.
2860: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
2870: 64 20 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f  d a new OP_ opco
2880: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
2890: 20 62 50 75 73 68 20 66 6c 61 67 20 69 73 20 74   bPush flag is t
28a0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  rue, then make t
28b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70  his opcode the p
28c0: 61 72 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62  arent for.** sub
28d0: 73 65 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73  sequent Explains
28e0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64   until sqlite3Vd
28f0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69  beExplainPop() i
2900: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  s called..*/.voi
2910: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2920: 6c 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lain(Parse *pPar
2930: 73 65 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f  se, u8 bPush, co
2940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2950: 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ...){.#ifndef SQ
2960: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2970: 41 6c 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74  Always include t
2980: 68 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  he OP_Explain op
2990: 63 6f 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f  codes if SQLITE_
29a0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
29b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20  ..  ** But omit 
29c0: 74 68 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72  them (for perfor
29d0: 6d 61 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72  mance) during pr
29e0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20  oduction builds 
29f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
2a00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
2a10: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61  ndif.  {.    cha
2a20: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62  r *zMsg;.    Vdb
2a30: 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73  e *v;.    va_lis
2a40: 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54  t ap;.    int iT
2a50: 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  his;.    va_star
2a60: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2a70: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56   zMsg = sqlite3V
2a80: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a90: 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  db, zFmt, ap);. 
2aa0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2ab0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
2ac0: 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20  Vdbe;.    iThis 
2ad0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71  = v->nOp;.    sq
2ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2af0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
2b00: 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64  This, pParse->ad
2b10: 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20  drExplain, 0,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e      zMsg, P4_DYN
2b40: 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  AMIC);.    sqlit
2b50: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2b60: 69 6e 74 28 62 50 75 73 68 3f 22 50 55 53 48 22  int(bPush?"PUSH"
2b70: 3a 22 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  :"", sqlite3Vdbe
2b80: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e  GetOp(v,-1)->p4.
2b90: 7a 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  z);.    if( bPus
2ba0: 68 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  h){.      pParse
2bb0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
2bc0: 69 54 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  iThis;.    }.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
2be0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
2bf0: 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c  PLAN stack one l
2c00: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
2c10: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2c20: 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
2c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e){.  sqlite3Exp
2c40: 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22  lainBreakpoint("
2c50: 50 4f 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72  POP", 0);.  pPar
2c60: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  se->addrExplain 
2c70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
2c80: 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73  lainParent(pPars
2c90: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
2ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2cb0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  AIN */../*.** Ad
2cc0: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2cd0: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2cf0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
2d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d10: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
2d20: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
2d30: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
2d40: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
2d50: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2d60: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2d70: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2d80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2db0: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2dc0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2dd0: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2df0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2e00: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
2e10: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
2e20: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
2e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e40: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
2e50: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2e60: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2e70: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2e80: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2e90: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2ea0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2ec0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2ed0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2ee0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2ef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
2f10: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2f20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2f30: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2f40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f60: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2f70: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2f90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2fa0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2fb0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2ff0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
3000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
3010: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
3020: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
3030: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3040: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
3050: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
3060: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
3070: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
30b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70   P4_INT32;.    p
30c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20  Op->p4.i = p4;. 
30d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
30e0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72  he end of a co-r
3100: 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73  outine.*/.void s
3110: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
3120: 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20  outine(Vdbe *v, 
3130: 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20  int regYield){. 
3140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3150: 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
3160: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
3170: 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  ;..  /* Clear th
3180: 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
3190: 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72  ster cache, ther
31a0: 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61  eby ensuring tha
31b0: 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72  t each.  ** co-r
31c0: 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f  outine has its o
31d0: 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  wn independent s
31e0: 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c  et of registers,
31f0: 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74   because co-rout
3200: 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  ines.  ** might 
3210: 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67  expect their reg
3220: 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65  isters to be pre
3230: 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e  served across an
3240: 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20   OP_Yield, and. 
3250: 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63   ** that could c
3260: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66  ause problems if
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d   two or more co-
3280: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69  routines are usi
3290: 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ng the same.  **
32a0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
32b0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70  ter..  */.  v->p
32c0: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
32d0: 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65  = 0;.  v->pParse
32e0: 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
32f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3300: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
3310: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
3320: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
3330: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
3340: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
3350: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
3360: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
3370: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
3380: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
3390: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
33a0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
33b0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
33c0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
33d0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
33e0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
33f0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
3400: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
3410: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
3420: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
3430: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
3440: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
3450: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
3460: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
3470: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
3480: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
3490: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
34a0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
34b0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
34c0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
34d0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
34e0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
34f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
3500: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
3510: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3520: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
3530: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
3540: 2a 20 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20  * (Later:) This 
3550: 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
3560: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
3570: 76 65 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d  ve the OPFLG_JUM
3580: 50 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a  P.** property..*
3590: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73  *.** Variable us
35a0: 61 67 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a  age notes:.**.**
35b0: 20 20 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65       Parse.aLabe
35c0: 6c 5b 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20  l[x]     Stores 
35d0: 74 68 65 20 61 64 64 72 65 73 73 20 74 68 61 74  the address that
35e0: 20 74 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20   the x-th label 
35f0: 72 65 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20  resolves.**     
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74      into.  For t
3620: 65 73 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44  esting (SQLITE_D
3630: 45 42 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65  EBUG), unresolve
3640: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 62               lab
3660: 65 6c 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62  els stores -1, b
3670: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72  ut that is not r
3680: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20  equired..**     
3690: 50 61 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f  Parse.nLabelAllo
36a0: 63 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c  c   Number of sl
36b0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ots allocated to
36c0: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a   Parse.aLabel[].
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a  bel        The *
36f0: 6e 65 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65  negative* of the
3700: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c   number of label
3710: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 62 65 65 6e 20 69 73 73 75         been issu
3740: 65 64 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76  ed.  The negativ
3750: 65 20 69 73 20 73 74 6f 72 65 64 20 62 65 63 61  e is stored beca
3760: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  use.**          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3780: 68 61 74 20 67 69 76 65 73 20 61 20 70 65 72 66  hat gives a perf
3790: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
37a0: 65 6e 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67  ent over storing
37b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
37d0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74  equivalent posit
37e0: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ive value..*/.in
37f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
3800: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50  eLabel(Parse *pP
3810: 61 72 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  arse){.  return 
3820: 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  --pParse->nLabel
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
3840: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
3850: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
3860: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3870: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
3880: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
3890: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
38a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
38b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
38c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
38d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38e0: 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  l()..*/.static S
38f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3900: 6f 69 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76  oid resizeResolv
3910: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c  eLabel(Parse *p,
3920: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29   Vdbe *v, int j)
3930: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  {.  int nNewSize
3940: 20 3d 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65   = 10 - p->nLabe
3950: 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  l;.  p->aLabel =
3960: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3970: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
3980: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39a0: 4e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  NewSize*sizeof(p
39b0: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
39c0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
39d0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
39e0: 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  elAlloc = 0;.  }
39f0: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
3a00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e  ITE_DEBUG.    in
3a10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
3a20: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69  ->nLabelAlloc; i
3a30: 3c 6e 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20  <nNewSize; i++) 
3a40: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
3a50: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  1;.#endif.    p-
3a60: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e  >nLabelAlloc = n
3a70: 4e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e  NewSize;.    p->
3a80: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3a90: 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  Op;.  }.}.void s
3aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3ab0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3ac0: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3ad0: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3ae0: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3b00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3b10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3b20: 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c  rt( j<-p->nLabel
3b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
3b40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
3b50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
3b60: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
3b70: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3b80: 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
3b90: 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45  tf("RESOLVE LABE
3ba0: 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78  L %d to %d\n", x
3bb0: 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23  , v->nOp);.  }.#
3bc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
3bd0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e  LabelAlloc + p->
3be0: 6e 4c 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20  nLabel < 0 ){.  
3bf0: 20 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c    resizeResolveL
3c00: 61 62 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d  abel(p,v,j);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3c20: 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d  ( p->aLabel[j]==
3c30: 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c  (-1) ); /* Label
3c40: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
3c50: 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20  solved once */. 
3c60: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
3c70: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = v->nOp;.  }.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3c90: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3ca0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3cb0: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
3cc0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
3cd0: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
3ce0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3cf0: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Once = 1;.}../*.
3d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c   only be run mul
3d30: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a  tiple times..*/.
3d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d50: 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70  Reusable(Vdbe *p
3d60: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
3d70: 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64  nce = 0;.}..#ifd
3d80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
3d90: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
3da0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
3db0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
3dc0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
3dd0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
3de0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
3df0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e00: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
3e10: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
3e20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
3e30: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
3e40: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
3e50: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
3e60: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
3e70: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3e80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3e90: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
3ea0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
3eb0: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
3ec0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
3ed0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
3ee0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
3f10: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
3f20: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
3f30: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3f40: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
3f50: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
3f60: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
3f70: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
3f80: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3f90: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
3fa0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3fb0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
3fc0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
3fd0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
3fe0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
4000: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
4010: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
4020: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
4030: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
4040: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4050: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
4060: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4080: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4090: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
40a0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
40c0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
40d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
40e0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
40f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4100: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
4110: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
4120: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
4130: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
4140: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
4150: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
4160: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
4170: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
4180: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
4190: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
41a0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
41b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
41c0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
41d0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
41e0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
41f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4200: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
4210: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
4220: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
4230: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
4240: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
4250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
4260: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
4270: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
4280: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
4290: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
42a0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
42b0: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
42c0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
42d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
42e0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
42f0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
4300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
4310: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
4320: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
4330: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
4340: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
4350: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4370: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
4380: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
4390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
43a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
43b0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
43c0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
43d0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
43e0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
43f0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
4400: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4420: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4440: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
4450: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
4460: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
4470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
44a0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
44b0: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
44c0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
44d0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
44e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
44f0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
4500: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
4510: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
4520: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
4530: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
4540: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
4550: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
4560: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
4570: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
4580: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
4590: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
45a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
45b0: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
45c0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
45d0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
45e0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
45f0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
4600: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
4610: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
4620: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
4630: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
4640: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
4650: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
4660: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
4670: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
4680: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
4690: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
46a0: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
46b0: 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49  ateBtree/BTREE_I
46c0: 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69  NTKEY and OP_Ini
46d0: 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20  tCoroutine .**  
46e0: 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45 20      (for CREATE 
46f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
4700: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
4710: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
4720: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
4730: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
4740: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
4750: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
4760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4770: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4780: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
4790: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
47a0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
47b0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
47c0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
47d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
47e0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
47f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
4800: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
4810: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4820: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
4830: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
4840: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
4850: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
4860: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
4870: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
4880: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
4890: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
48a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
48b0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
48c0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
48d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
48e0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
48f0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
4900: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
4910: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
4920: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
4930: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
4940: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
4950: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
4960: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
4970: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
4980: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
4990: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
49a0: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
49b0: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
49c0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
49d0: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 6f 70  name .     || op
49e0: 63 6f 64 65 3d 3d 4f 50 5f 56 44 65 73 74 72 6f  code==OP_VDestro
49f0: 79 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64  y.     || (opcod
4a00: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 20  e==OP_Function0 
4a10: 26 26 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63  && pOp->p4.pFunc
4a20: 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
4a30: 54 45 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c  TE_FUNC_INTERNAL
4a40: 29 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  ).     || ((opco
4a50: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
4a60: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
4a70: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
4a80: 28 28 70 4f 70 2d 3e 70 31 29 21 3d 53 51 4c 49  ((pOp->p1)!=SQLI
4a90: 54 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 32  TE_OK && pOp->p2
4aa0: 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20  ==OE_Abort)).   
4ab0: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f   ){.      hasAbo
4ac0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  rt = 1;.      br
4ad0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72  f( opcode==OP_Cr
4af0: 65 61 74 65 42 74 72 65 65 20 26 26 20 70 4f 70  eateBtree && pOp
4b00: 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b  ->p3==BTREE_INTK
4b10: 45 59 20 29 20 68 61 73 43 72 65 61 74 65 54 61  EY ) hasCreateTa
4b20: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ble = 1;.    if(
4b30: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74   opcode==OP_Init
4b40: 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49  Coroutine ) hasI
4b50: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  nitCoroutine = 1
4b60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4b70: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
4b80: 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  Y.    if( opcode
4b90: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
4ba0: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
4bb0: 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20  pOp->p2==1 ){.  
4bc0: 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72      hasFkCounter
4bd0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
4be0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
4bf0: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
4c00: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
4c10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4c20: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
4c30: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
4c40: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
4c50: 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  rred..  ** If ma
4c60: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
4c70: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
4c80: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
4c90: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
4ca0: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
4cb0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
4cc0: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
4cd0: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
4ce0: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
4cf0: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
4d00: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
4d10: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
4d20: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
4d30: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
4d40: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
4d50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
4d60: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
4d70: 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75  bort || hasFkCou
4d80: 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  nter.           
4d90: 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65     || (hasCreate
4da0: 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74  Table && hasInit
4db0: 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a  Coroutine) );.}.
4dc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4dd0: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
4de0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
4df0: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
4e00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4e10: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  DEBUG./*.** Incr
4e20: 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69 74 65  ement the nWrite
4e30: 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68 65 20   counter in the 
4e40: 56 44 42 45 20 69 66 20 74 68 65 20 63 75 72 73  VDBE if the curs
4e50: 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20  or is not an.** 
4e60: 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
4e70: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75 72 73  , or if the curs
4e80: 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  or argument is N
4e90: 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ULL..*/.void sql
4ea0: 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
4eb0: 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20 2a 70  eCounter(Vdbe *p
4ec0: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
4ed0: 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30 0a 20  ){.  if( pC==0. 
4ee0: 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72 54 79    || (pC->eCurTy
4ef0: 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52 54  pe!=CURTYPE_SORT
4f00: 45 52 0a 20 20 20 20 20 20 20 26 26 20 70 43 2d  ER.       && pC-
4f10: 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
4f20: 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20 20 20  PE_PSEUDO.      
4f30: 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68 65 6d   && !pC->isEphem
4f40: 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20 20 70  eral).  ){.    p
4f50: 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 7d 0a  ->nWrite++;.  }.
4f60: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4f70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
4f80: 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20 61 6e  .** Assert if an
4f90: 20 41 62 6f 72 74 20 61 74 20 74 68 69 73 20 70   Abort at this p
4fa0: 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d 69 67  oint in time mig
4fb0: 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ht result in a c
4fc0: 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61 62 61  orrupt.** databa
4fd0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
4fe0: 74 65 33 56 64 62 65 41 73 73 65 72 74 41 62 6f  te3VdbeAssertAbo
4ff0: 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b  rtable(Vdbe *p){
5000: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 57  .  assert( p->nW
5010: 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e 75 73  rite==0 || p->us
5020: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b  esStmtJournal );
5030: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5050: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
5060: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
5070: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49  een inserted.  I
5080: 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75  t loops.** throu
5090: 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64  gh all the opcod
50a0: 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20  es and fixes up 
50b0: 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  some details..**
50c0: 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68  .** (1) For each
50d0: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
50e0: 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76  n with a negativ
50f0: 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61  e P2 value (a la
5100: 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f  bel).**     reso
5110: 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65  lve the P2 value
5120: 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64   to an actual ad
5130: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29  dress..**.** (2)
5140: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78   Compute the max
5150: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
5160: 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79  rguments used by
5170: 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f   any SQL functio
5180: 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f  n.**     and sto
5190: 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  re that value in
51a0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a   *pMaxFuncArgs..
51b0: 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65  **.** (3) Update
51c0: 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e   the Vdbe.readOn
51d0: 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52  ly and Vdbe.bIsR
51e0: 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61  eader flags to a
51f0: 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20  ccurately.**    
5200: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
5210: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
5220: 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64  ement actually d
5230: 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49  oes..**.** (4) I
5240: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34  nitialize the p4
5250: 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  .xAdvance pointe
5260: 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61  r on opcodes tha
5270: 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  t use it..**.** 
5280: 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20  (5) Reclaim the 
5290: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
52a0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62   for storing lab
52b0: 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  els..**.** This 
52c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
52d0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65  y function corre
52e0: 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70  ctly if the mkop
52f0: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
5300: 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75  tor.** script nu
5310: 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65  mbers the opcode
5320: 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68  s correctly.  Ch
5330: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f  anges to this ro
5340: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a  utine must be.**
5350: 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74   coordinated wit
5360: 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f  h changes to mko
5370: 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73  pcodeh.tcl..*/.s
5380: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
5390: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
53a0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
53b0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d  cArgs){.  int nM
53c0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
53d0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
53e0: 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p;.  Parse *pPar
53f0: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
5400: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
5410: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a  pParse->aLabel;.
5420: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
5430: 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65  1;.  p->bIsReade
5440: 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26  r = 0;.  pOp = &
5450: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5460: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20  ;.  while(1){.. 
5470: 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20     /* Only JUMP 
5480: 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20  opcodes and the 
5490: 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70  short list of sp
54a0: 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e  ecial opcodes in
54b0: 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20   the switch.    
54c0: 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f  ** below need to
54d0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
54e0: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
54f0: 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72  cl generator scr
5500: 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a  ipt groups.    *
5510: 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f  * all these opco
5520: 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61  des together nea
5530: 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  r the front of t
5540: 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20  he opcode list. 
5550: 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79   Skip.    ** any
5560: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65   opcode that doe
5570: 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65  s not need proce
5580: 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c  ssing by virtual
5590: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
55a0: 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c  t.    ** it is l
55b0: 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
55c0: 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45  E_MX_JUMP_OPCODE
55d0: 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  , as a performan
55e0: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
55f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c  pOp->opcode<=SQL
5610: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
5620: 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  DE ){.      /* N
5630: 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20  OTE: Be sure to 
5640: 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68  update mkopcodeh
5650: 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67  .tcl when adding
5660: 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20   or removing.   
5670: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
5680: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
5690: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
56a0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
56b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
56c0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
56d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
56e0: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
56f0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
5700: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
5710: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
5720: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
5730: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20  oCommit:.       
5740: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
5750: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt: {.          
5760: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
5770: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5780: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
5790: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
57a0: 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73  _WAL.        cas
57b0: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
57c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
57d0: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
57e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
57f0: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
5800: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64           p->read
5810: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
5820: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
5830: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
5840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5850: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5860: 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20 20 63  _Next:.        c
5870: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
5880: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t: {.          p
5890: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
58a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
58b0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  xt;.          pO
58c0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
58d0: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
58e0: 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65    /* The code ge
58f0: 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f  nerator never co
5900: 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65  des any of these
5910: 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75   opcodes as a ju
5920: 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  mp.          ** 
5930: 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65  to a label.  The
5940: 79 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64  y are always cod
5950: 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63  ed as a jump bac
5960: 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20  kwards to a .   
5970: 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20         ** known 
5980: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20  address */.     
5990: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
59a0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20  ->p2>=0 );.     
59b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
59c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
59d0: 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a 20 20  se OP_Prev: {.  
59e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
59f0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
5a00: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
5a10: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
5a20: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
5a30: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  NCE;.          /
5a40: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
5a50: 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73  ator never codes
5a60: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70   any of these op
5a70: 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a  codes as a jump.
5a80: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
5a90: 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61  a label.  They a
5aa0: 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20  re always coded 
5ab0: 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61  as a jump backwa
5ac0: 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20  rds to a .      
5ad0: 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64      ** known add
5ae0: 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ress */.        
5af0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5b00: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  2>=0 );.        
5b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5b20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5b30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5b40: 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73 65  BLE.        case
5b50: 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
5b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
5b70: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
5b80: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
5b90: 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  p2;.          br
5ba0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5bb0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5bc0: 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Filter: {.      
5bd0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
5be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
5bf0: 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33  p - p->aOp) >= 3
5c00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
5c10: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
5c20: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
5c30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20   );.          n 
5c40: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
5c50: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d          if( n>nM
5c60: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
5c70: 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  s = n;.         
5c80: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
5c90: 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61 75 6c   into the defaul
5ca0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  t case */.      
5cb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
5cc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5cd0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
5ce0: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  >p2<0 ){.       
5cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
5d00: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
5d10: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
5d20: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
5d30: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20 20   only.          
5d40: 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70    ** non-jump op
5d50: 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20  codes less than 
5d60: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43  SQLITE_MX_JUMP_C
5d70: 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74 65  ODE are guarante
5d80: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
5d90: 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65    ** have non-ne
5da0: 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f  gative values fo
5db0: 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 20  r P2. */.       
5dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71       assert( (sq
5dd0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
5de0: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
5df0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
5e00: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
5e10: 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f   assert( ADDR(pO
5e20: 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65 2d 3e  p->p2)<-pParse->
5e30: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
5e40: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
5e50: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
5e60: 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  >p2)];.         
5e70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
5e80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
5ea0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5eb0: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5ec0: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5ed0: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5ee0: 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f     ** non-jump o
5ef0: 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e  pcodes less than
5f00: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
5f10: 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74  CODE are guarant
5f20: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eed to.      ** 
5f30: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5f40: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5f50: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
5f60: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
5f70: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
5f80: 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50  code]&OPFLG_JUMP
5f90: 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e  )==0 || pOp->p2>
5fa0: 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
5fb0: 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29  f( pOp==p->aOp )
5fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d   break;.    pOp-
5fd0: 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  -;.  }.  sqlite3
5fe0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
5ff0: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
6000: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
6010: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
6020: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
6030: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
6040: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
6050: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
6060: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
6070: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
6080: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6090: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
60a0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
60b0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
60c0: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
60d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
60e0: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
60f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6100: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6110: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
6120: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
6130: 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20 6c  Verify that at l
6140: 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c  east N opcode sl
6150: 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ots are availabl
6160: 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a  e in p without.*
6170: 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c  * having to mall
6180: 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63  oc for more spac
6190: 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20 63  e (except when c
61a0: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a  ompiled using.**
61b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
61c0: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54  LLOC_STRESS).  T
61d0: 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
61e0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
61f0: 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66  ting.** to verif
6200: 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 63  y that certain c
6210: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
6220: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63  dbeAddOpList() c
6230: 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c  an never.** fail
6240: 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61   due to a OOM fa
6250: 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68  ult and hence th
6260: 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  at the return va
6270: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  lue from.** sqli
6280: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6290: 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  () will always b
62a0: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23  e non-NULL..*/.#
62b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
62c0: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
62d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
62e0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
62f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6300: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
6310: 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c  equired(Vdbe *p,
6320: 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
6330: 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d  t( p->nOp + N <=
6340: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a   p->nOpAlloc );.
6350: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6360: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
6370: 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68 65  VM passed as the
6380: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 64   only argument d
6390: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
63a0: 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  ** an OP_ResultR
63b0: 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c 20  ow opcode. Fail 
63c0: 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20 69  an assert() if i
63d0: 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73 20  t does. This is 
63e0: 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65 20  used.** by code 
63f0: 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20 65  in pragma.c to e
6400: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69  nsure that the i
6410: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6420: 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61 67   certain.** prag
6430: 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69 74  mas comports wit
6440: 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65 63  h the flags spec
6450: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b 70  ified in the mkp
6460: 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a 20  ragmatab.tcl.** 
6470: 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20 64  script..*/.#if d
6480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6490: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
64a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41  (SQLITE_TEST_REA
64b0: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69  LLOC_STRESS).voi
64c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72  d sqlite3VdbeVer
64d0: 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 56  ifyNoResultRow(V
64e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
64f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6500: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
6510: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b   assert( p->aOp[
6520: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 65  i].opcode!=OP_Re
6530: 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d  sultRow );.  }.}
6540: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
6550: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61 20  enerate code (a 
6560: 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74 61  single OP_Aborta
6570: 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61 74  ble opcode) that
6580: 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79 20   will.** verify 
6590: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70 72  that the VDBE pr
65a0: 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c 79  ogram can safely
65b0: 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20 74   call Abort in t
65c0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
65d0: 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64 65  ntext..*/.#if de
65e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
65f0: 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UG).void sqlite3
6600: 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
6610: 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ble(Vdbe *p, int
6620: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66 28   onError){.  if(
6630: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
6640: 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rt ) sqlite3Vdbe
6650: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62 6f  AddOp0(p, OP_Abo
6660: 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69  rtable);.}.#endi
6670: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
6680: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
6690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
66a0: 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73  array of opcodes
66b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
66c0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73  .** the Vdbe pas
66d0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
66e0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73   argument. It is
66f0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
6700: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74  ponsibility.** t
6710: 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68  o arrange for th
6720: 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79  e returned array
6730: 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c   to be eventuall
6740: 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68  y freed using th
6750: 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70  e .** vdbeFreeOp
6760: 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e  Array() function
6770: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
6780: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20  eturning, *pnOp 
6790: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
67a0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
67b0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  in the returned.
67c0: 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20  ** array. Also, 
67d0: 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74  *pnMaxArg is set
67e0: 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f   to the larger o
67f0: 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  f its current va
6800: 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  lue and .** the 
6810: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
6820: 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70  s in the Vdbe.ap
6830: 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75  Arg[] array requ
6840: 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  ired to execute 
6850: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
6860: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62   program..*/.Vdb
6870: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6880: 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65  TakeOpArray(Vdbe
6890: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20   *p, int *pnOp, 
68a0: 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a  int *pnMaxArg){.
68b0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20    VdbeOp *aOp = 
68c0: 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->aOp;.  assert
68d0: 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d  ( aOp && !p->db-
68e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
68f0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
6900: 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  t sqlite3VdbeUse
6910: 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74  sBtree() was not
6920: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
6930: 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  VM */.  assert( 
6940: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
6950: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a  >btreeMask) );..
6960: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
6970: 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a  s(p, pnMaxArg);.
6980: 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70    *pnOp = p->nOp
6990: 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a  ;.  p->aOp = 0;.
69a0: 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a    return aOp;.}.
69b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
69c0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
69d0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
69e0: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
69f0: 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
6a00: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
6a10: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65  ed..**.** Non-ze
6a30: 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73 20  ro P2 arguments 
6a40: 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  to jump instruct
6a50: 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ions are automat
6a60: 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a  ically adjusted.
6a70: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a  ** so that the j
6a80: 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72 65  ump target is re
6a90: 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66 69  lative to the fi
6aa0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  rst operation in
6ab0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f  serted..*/.VdbeO
6ac0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 64  p *sqlite3VdbeAd
6ad0: 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dOpList(.  Vdbe 
6ae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6af0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 6f          /* Add o
6b00: 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70 72  pcodes to the pr
6b10: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20   */.  int nOp,  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6b50: 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20 2a  opcodes to add *
6b60: 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63  /.  VdbeOpList c
6b70: 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 20  onst *aOp,      
6b80: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20   /* The opcodes 
6b90: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
6ba0: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20   int iLineno    
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6bc0: 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e   Source-file lin
6bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73  e number of firs
6be0: 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  t opcode */.){. 
6bf0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
6c00: 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b   *pOut, *pFirst;
6c10: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30  .  assert( nOp>0
6c20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
6c30: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
6c40: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
6c50: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
6c60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  p->nOpAlloc && g
6c70: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f  rowOpArray(p, nO
6c80: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
6c90: 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74   0;.  }.  pFirst
6ca0: 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f   = pOut = &p->aO
6cb0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72  p[p->nOp];.  for
6cc0: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
6cd0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
6ce0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f  {.    pOut->opco
6cf0: 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65  de = aOp->opcode
6d00: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d  ;.    pOut->p1 =
6d10: 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f   aOp->p1;.    pO
6d20: 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32  ut->p2 = aOp->p2
6d30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f  ;.    assert( aO
6d40: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
6d50: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
6d60: 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e  deProperty[aOp->
6d70: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
6d80: 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d  JUMP)!=0 && aOp-
6d90: 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
6da0: 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f  Out->p2 += p->nO
6db0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  p;.    }.    pOu
6dc0: 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b  t->p3 = aOp->p3;
6dd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70  .    pOut->p4typ
6de0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6df0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
6e00: 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35   0;.    pOut->p5
6e10: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
6e20: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6e30: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
6e40: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
6e50: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
6e60: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
6e70: 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d  VERAGE.    pOut-
6e80: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
6e90: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
6ea0: 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a   (void)iLineno;.
6eb0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
6ec0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
6ed0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
6ee0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
6ef0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
6f00: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
6f10: 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c  tOp(0, i+p->nOp,
6f20: 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f   &p->aOp[i+p->nO
6f30: 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p]);.    }.#endi
6f40: 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b  f.  }.  p->nOp +
6f50: 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = nOp;.  return 
6f60: 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64  pFirst;.}..#if d
6f70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6f80: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
6f90: 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ATUS)./*.** Add 
6fa0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
6fb0: 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72  array of counter
6fc0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c  s managed by sql
6fd0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
6fe0: 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  atus()..*/.void 
6ff0: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
7000: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70  tatus(.  Vdbe *p
7010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74           /* VM t
7030: 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
7040: 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  () to */.  int a
7050: 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20  ddrExplain,     
7060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7070: 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
7080: 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20  ain (or 0) */.  
7090: 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20  int addrLoop,   
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f  /* Address of lo
70c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20  op counter */ . 
70d0: 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20   int addrVisit, 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
7100: 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e  ows visited coun
7110: 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ter */.  LogEst 
7120: 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  nEst,           
7130: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
7140: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
7150: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
7160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7170: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
7180: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
7190: 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67  e or index being
71a0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20   scanned */.){. 
71b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
71c0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
71d0: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
71e0: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
71f0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
7200: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
7210: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
7220: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
7230: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
7240: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
7250: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
7260: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
7270: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
7280: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
7290: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
72a0: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
72b0: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
72c0: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
72d0: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
72e0: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
72f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
7300: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7310: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
7320: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
7330: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
7340: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
7350: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
7360: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
7370: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
7380: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
7390: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
73a0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
73b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
73c0: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
73d0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
73e0: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
73f0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7400: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
7410: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
7420: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7430: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
7440: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
7450: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
7460: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
7470: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
7480: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7490: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
74a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
74b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
74c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
74d0: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
74e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
74f0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
7500: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
7510: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
7520: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
7530: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
7540: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7550: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
7560: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
7570: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
7580: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
75a0: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
75b0: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
75c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
75d0: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
75e0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
75f0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
7600: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
7610: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
7620: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
7630: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
7640: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7650: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
7660: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
7670: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
7680: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
7690: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
76a0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
76b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
76c0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
76d0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
76e0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
76f0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
7700: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
7710: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
7720: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7730: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
7740: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
7750: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
7760: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
7770: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
7780: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7790: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
77a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
77b0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
77c0: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
77d0: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
77e0: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
77f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7800: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
7810: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
7820: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
7830: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
7840: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
7850: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
7860: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
7870: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7880: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
7890: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
78a0: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
78b0: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
78c0: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
78d0: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
78e0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
78f0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
7900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7910: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
7920: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
7930: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
7940: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
7950: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
7960: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
7970: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
7980: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
7990: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
79a0: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
79b0: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
79c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
79d0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
79e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
79f0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
7a00: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
7a10: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
7a20: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
7a30: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
7a40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7a70: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7a80: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7a90: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7aa0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7ab0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7ac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ad0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7ae0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
7af0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
7b00: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
7b10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7b20: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
7b30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7b50: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7b60: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7b70: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7b80: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7bb0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7bc0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7bd0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7be0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7bf0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
7c00: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
7c10: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
7c20: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
7c30: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
7c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7c50: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7c60: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7c70: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7c80: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7c90: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7ca0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7cc0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7cd0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7ce0: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
7cf0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
7d00: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
7d10: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
7d20: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
7d30: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
7d40: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7d50: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7d60: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7d70: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7d80: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7d90: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7da0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7db0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7dc0: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7dd0: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7de0: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
7df0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
7e00: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
7e10: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
7e20: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
7e30: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
7e40: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7e50: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7e60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7e70: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7e80: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7e90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7ea0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7eb0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7ec0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7ed0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7ee0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7ef0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
7f00: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
7f10: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
7f20: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
7f30: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
7f40: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7f50: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7f60: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7f70: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f90: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7fa0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7fb0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7fc0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7fd0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7fe0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
7ff0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
8000: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
8010: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
8020: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
8030: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
8040: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
8050: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
8060: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
8070: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
8090: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
80a0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
80b0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
80c0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
80d0: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
80e0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
80f0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
8100: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
8110: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
8120: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
8130: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
8140: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
8150: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
8160: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
8170: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
8180: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
8190: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
81a0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
81b0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
81c0: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
81d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
81e0: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
81f0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
8200: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
8210: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
8220: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
8230: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8240: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8250: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
8260: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
8270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
8290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
82a0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
82b0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
82c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
82d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
82e0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
82f0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
8300: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
8310: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
8330: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
8340: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
8350: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
8360: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
8370: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
8380: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
8390: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
83a0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
83b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
83c0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
83d0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
83e0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
83f0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
8400: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
8410: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
8420: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
8430: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
8440: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
8450: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
8460: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
8470: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
8480: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
8490: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
84a0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
84b0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
84c0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
84d0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
84e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
84f0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
8500: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
8510: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
8520: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
8530: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
8540: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
8550: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
8560: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
8570: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
8580: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
8590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
85a0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
85b0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
85c0: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
85d0: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
85e0: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
85f0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
8600: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
8610: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
8620: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
8630: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
8640: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
8650: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
8660: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
8670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8680: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
8690: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
86a0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
86b0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
86c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
86d0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
86e0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
86f0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
8700: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
8710: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
8720: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
8730: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
8740: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
8750: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
8760: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
8770: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
8780: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
8790: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
87a0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
87b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
87c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
87d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
87e0: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
87f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8800: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8810: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
8820: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
8830: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
8840: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
8850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
8870: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
8880: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
8890: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
88a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
88b0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
88c0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
88d0: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
88e0: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
88f0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
8900: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
8910: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
8920: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
8930: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
8940: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
8950: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
8960: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
8970: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
8980: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
8990: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
89a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
89b0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
89c0: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
89d0: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
89e0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
89f0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
8a00: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
8a10: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
8a20: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
8a30: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
8a40: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8a50: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8a60: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8a70: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8a80: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8a90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8aa0: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8ab0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8ac0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8ad0: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8ae0: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
8af0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
8b00: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
8b10: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
8b20: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
8b30: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
8b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8b50: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8b60: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8b70: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8b80: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8b90: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8ba0: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8bb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8bc0: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8bd0: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8bf0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
8c00: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
8c10: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
8c20: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
8c30: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
8c40: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8c50: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8c60: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8c70: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8c80: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8c90: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8cb0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8cc0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8cd0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8ce0: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
8cf0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
8d00: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
8d10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8d20: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
8d30: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
8d40: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8d50: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8d60: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8d70: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8d80: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8d90: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8da0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8db0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8dc0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8dd0: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8de0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8df0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
8e00: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
8e10: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
8e20: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
8e30: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
8e40: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8e50: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8e60: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8e70: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8e80: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8e90: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8ea0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8eb0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8ec0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8ed0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8ee0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
8ef0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
8f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
8f10: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
8f20: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
8f30: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
8f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8f50: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8f60: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8f70: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8f80: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8f90: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8fa0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8fb0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8fc0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8fd0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8fe0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
8ff0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
9000: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
9010: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
9020: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
9030: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
9040: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
9050: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
9060: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9070: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
9080: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
9090: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
90a0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
90b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
90c0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
90d0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
90e0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
90f0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
9100: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
9110: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
9120: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
9130: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
9140: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
9150: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
9160: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
9170: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
9180: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
9190: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
91a0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
91b0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
91c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
91d0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
91e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
91f0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
9200: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
9210: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
9220: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
9230: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
9240: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
9250: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
9260: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
9270: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
9280: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
9290: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
92a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
92b0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
92c0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
92d0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
92e0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
92f0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
9300: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
9310: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9320: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
9330: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
9340: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
9350: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
9360: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
9370: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9380: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
9390: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
93a0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
93b0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
93c0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
93d0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
93e0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
93f0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
9400: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
9410: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9420: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
9430: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
9440: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
9450: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
9460: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
9470: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
9480: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
9490: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
94a0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
94b0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
94c0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
94d0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
94e0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
94f0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
9500: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
9510: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
9520: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
9530: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
9540: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
9550: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
9560: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
9570: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
9580: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9590: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
95a0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
95b0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
95c0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
95d0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
95e0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
95f0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
9600: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
9610: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
9620: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
9630: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
9640: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
9650: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
9660: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
9670: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
9680: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
9690: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
96a0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
96b0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
96c0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
96d0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
96e0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
96f0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
9700: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
9710: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
9720: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
9730: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
9740: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
9750: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
9760: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
9770: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
9780: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
9790: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
97a0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
97b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
97c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
97d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
97e0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
97f0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
9800: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
9810: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
9820: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
9830: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9840: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
9850: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
9860: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
9870: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
9880: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
9890: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
98a0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
98b0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
98c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
98d0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
98e0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
98f0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
9900: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
9910: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
9920: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
9930: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
9940: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
9950: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
9960: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
9970: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
9980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
9990: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
99a0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
99b0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
99c0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
99d0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
99e0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
99f0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
9a00: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
9a10: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
9a20: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
9a30: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
9a40: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9a50: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9a60: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9a70: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9a80: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9a90: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9aa0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9ab0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9ac0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9ad0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9ae0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
9af0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
9b00: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
9b10: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
9b20: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
9b30: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
9b40: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9b50: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9b60: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9b70: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9b80: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9b90: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9ba0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9bb0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9bc0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9bd0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9be0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
9bf0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
9c00: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
9c10: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
9c20: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
9c30: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
9c40: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9c50: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9c60: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9c70: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9c80: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9c90: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9ca0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9cb0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9cc0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9cd0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9ce0: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
9cf0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
9d00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
9d10: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
9d20: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
9d30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9d40: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9d50: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9d60: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9d70: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9d80: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9d90: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9da0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9db0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9dc0: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9dd0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9de0: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
9df0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
9e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9e10: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
9e20: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
9e30: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
9e40: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9e60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9e70: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9e80: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9e90: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9eb0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9ec0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9ed0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9ee0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
9ef0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
9f00: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
9f10: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
9f20: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
9f30: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
9f40: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9f60: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9f70: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9f80: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9f90: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9fa0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9fb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9fc0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9fd0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9fe0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
9ff0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
a000: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a010: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
a020: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
a030: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
a040: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
a050: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a060: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
a070: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
a080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
a090: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
a0a0: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
a0b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a0c0: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
a0d0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
a0e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a0f0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
a100: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
a110: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
a120: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
a130: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
a140: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
a150: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
a170: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
a180: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
a190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a1a0: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
a1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a1c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a1d0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
a1e0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
a1f0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
a200: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
a210: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
a220: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
a230: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
a240: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
a250: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
a260: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
a270: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a280: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
a290: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
a2a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a2b0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
a2c0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
a2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
a2e0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
a2f0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
a300: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
a310: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a320: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
a330: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
a340: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
a350: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
a360: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
a370: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
a380: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
a390: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
a3a0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
a3b0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
a3c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
a3d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
a3e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
a3f0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
a400: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a410: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a420: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
a430: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
a440: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
a450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
a460: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
a470: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
a480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
a490: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
a4a0: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
a4b0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
a4c0: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
a4d0: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
a4e0: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
a4f0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
a500: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
a510: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
a520: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
a530: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
a540: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
a550: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
a560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a570: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
a580: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
a590: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
a5a0: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
a5b0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a5c0: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
a5d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
a5e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a5f0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
a600: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a610: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
a620: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
a630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a640: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
a650: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a660: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
a670: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
a680: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
a690: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
a6a0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a6b0: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
a6c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
a6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
a6f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
a700: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
a710: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
a720: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a730: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
a740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a750: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a760: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
a770: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
a780: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
a790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
a7b0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
a7c0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
a7d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
a7e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
a7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a800: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
a810: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
a820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a830: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
a840: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
a850: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a860: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
a870: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
a880: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a890: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
a8a0: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
a8b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
a8c0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
a8d0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a8e0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
a8f0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
a900: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a910: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
a920: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
a930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a940: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
a950: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
a960: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a970: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
a980: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
a990: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
a9a0: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
a9b0: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
a9c0: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
a9d0: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
a9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9f0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
aa00: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
aa10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aa20: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
aa30: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
aa40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa50: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
aa60: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
aa70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
aa80: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
aa90: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
aaa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
aab0: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
aac0: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
aad0: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
aae0: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
aaf0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ab00: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
ab10: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
ab20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ab30: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
ab40: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
ab50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab60: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
ab70: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
ab80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
ab90: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
aba0: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
abb0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
abc0: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
abd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
abe0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
abf0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
ac00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ac10: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
ac20: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
ac30: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
ac40: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
ac50: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
ac60: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
ac70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
ac80: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
ac90: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
aca0: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
acb0: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
acc0: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
acd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
ace0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
acf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ad00: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
ad10: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
ad20: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
ad30: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ad40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ad50: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
ad60: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
ad70: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
ad80: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
ad90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
ada0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
adb0: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
adc0: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
add0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
ade0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
adf0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
ae00: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
ae10: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
ae20: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
ae30: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
ae40: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
ae50: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
ae60: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
ae70: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
ae80: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
ae90: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
aea0: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
aeb0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
aec0: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
aed0: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
aee0: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
aef0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
af00: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
af10: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
af20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
af30: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
af40: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
af50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
af60: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
af70: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
af80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
af90: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
afa0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
afb0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
afc0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
afd0: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
afe0: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
aff0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
b000: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
b010: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b020: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
b030: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
b040: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
b050: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
b060: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
b070: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
b080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b090: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
b0a0: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
b0b0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
b0c0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
b0d0: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
b0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b100: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
b110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b120: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
b130: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
b140: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
b150: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
b160: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
b170: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
b180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b190: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
b1a0: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
b1b0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
b1c0: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
b1d0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
b1e0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b1f0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
b200: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
b210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b220: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
b230: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
b240: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
b250: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
b260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b270: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
b280: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
b290: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
b2a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b2b0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
b2c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
b2d0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
b2e0: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
b2f0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
b300: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
b310: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
b320: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
b330: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b340: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
b350: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
b360: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
b370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b380: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
b390: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
b3a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b3b0: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
b3c0: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
b3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
b3f0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
b400: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b410: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
b420: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
b430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b440: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b460: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
b470: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
b480: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
b490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b4a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
b4b0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
b4c0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
b4d0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
b4e0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
b4f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
b500: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
b510: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
b520: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
b530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b540: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b550: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
b560: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
b570: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
b580: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
b590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b5a0: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b5b0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
b5c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
b5d0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
b5e0: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
b5f0: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
b600: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
b610: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b620: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
b630: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
b640: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
b650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b660: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b670: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b680: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
b690: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
b6a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b6b0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
b6c0: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
b6d0: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
b6e0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b6f0: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
b700: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
b710: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b720: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
b730: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
b740: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
b750: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
b760: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
b770: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
b780: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
b790: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
b7a0: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
b7d0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
b7e0: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
b7f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
b800: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
b810: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b820: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
b830: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
b840: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
b850: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
b860: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b870: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
b880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b890: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
b8a0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
b8b0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b8c0: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
b8d0: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
b8e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b8f0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
b900: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
b910: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
b920: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
b930: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b940: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
b950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b960: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b970: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
b980: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
b990: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b9a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b9b0: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
b9c0: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
b9d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
b9e0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
b9f0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
ba00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ba10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
ba20: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
ba30: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
ba40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
ba50: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
ba60: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
ba70: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
ba80: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
ba90: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
baa0: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
bab0: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
bac0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
bad0: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
bae0: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
baf0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
bb00: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
bb10: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
bb20: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
bb30: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
bb40: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
bb50: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
bb60: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
bb70: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
bb80: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
bb90: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
bba0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
bbb0: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
bbc0: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
bbd0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
bbe0: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
bbf0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
bc00: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
bc10: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
bc20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
bc30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
bc40: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
bc50: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
bc60: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
bc70: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
bc80: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
bc90: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
bca0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
bcb0: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
bcc0: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
bcd0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
bce0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bcf0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
bd00: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
bd10: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
bd20: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
bd30: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
bd40: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
bd50: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
bd60: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
bd70: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
bd80: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
bd90: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
bda0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
bdb0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
bdc0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
bdd0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
bde0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
bdf0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
be00: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
be10: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
be20: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
be30: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
be40: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
be50: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
be60: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
be70: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
be80: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
be90: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
bea0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
beb0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
bec0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
bed0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
bee0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
bef0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
bf00: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
bf10: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
bf20: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
bf30: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
bf40: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
bf50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
bf60: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
bf70: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
bf80: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
bf90: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
bfa0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
bfb0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
bfc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
bfd0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
bfe0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
bff0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
c000: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
c010: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
c020: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
c030: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
c040: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
c050: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
c060: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
c070: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
c080: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
c090: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
c0a0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
c0b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
c0c0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
c0d0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
c0e0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
c0f0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
c100: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
c110: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
c120: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
c130: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
c140: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
c150: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
c160: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
c170: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
c180: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
c190: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
c1a0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
c1b0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
c1c0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
c1d0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
c1e0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
c1f0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
c200: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
c210: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
c220: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c230: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
c240: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
c250: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
c260: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c270: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
c280: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
c290: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
c2a0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
c2b0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
c2c0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
c2d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c2e0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
c2f0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
c300: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
c310: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
c320: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
c330: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
c340: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
c350: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
c360: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
c370: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
c380: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
c390: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
c3a0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
c3b0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
c3c0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
c3d0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
c3e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c3f0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
c400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
c410: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
c420: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
c430: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
c440: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
c450: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
c460: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
c470: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
c480: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
c490: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
c4a0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
c4b0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
c4c0: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
c4d0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
c4e0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
c4f0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
c500: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
c510: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
c520: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
c530: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
c540: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
c550: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
c560: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
c570: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c580: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
c590: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
c5a0: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
c5b0: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
c5c0: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
c5d0: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
c5e0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
c5f0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
c600: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
c610: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
c620: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
c630: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
c640: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
c650: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
c660: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
c670: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
c680: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
c690: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
c6a0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
c6b0: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
c6c0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
c6d0: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
c6e0: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
c6f0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
c700: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
c710: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
c720: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
c730: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
c740: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
c750: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
c760: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
c770: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
c780: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
c790: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
c7a0: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
c7b0: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
c7c0: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
c7d0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
c7e0: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
c7f0: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
c800: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
c810: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
c820: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
c830: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
c840: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
c850: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
c860: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
c870: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
c880: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
c890: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c8a0: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
c8b0: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
c8c0: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
c8d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
c8e0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
c8f0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
c900: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
c910: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
c920: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
c930: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
c940: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
c950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c960: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
c970: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
c980: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
c990: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
c9a0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
c9b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
c9c0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
c9d0: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
c9e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
c9f0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
ca00: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
ca10: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
ca20: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
ca30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
ca40: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
ca50: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
ca60: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
ca70: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
ca80: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
ca90: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
caa0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
cab0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
cac0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
cad0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
cae0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
caf0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
cb00: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
cb10: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
cb20: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
cb30: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
cb40: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
cb50: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
cb60: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
cb70: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
cb80: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
cb90: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
cba0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
cbb0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
cbc0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
cbd0: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
cbe0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
cbf0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
cc00: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
cc10: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
cc20: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
cc30: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
cc40: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
cc50: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
cc60: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
cc70: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
cc80: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
cc90: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
cca0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
ccb0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
ccc0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
ccd0: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
cce0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
ccf0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
cd00: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
cd10: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
cd20: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
cd30: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
cd40: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
cd50: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
cd60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cd70: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
cd80: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
cd90: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
cda0: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
cdb0: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
cdc0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
cdd0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20  EM_Agg|MEM_Dyn) 
cde0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cdf0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
ce00: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
ce10: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
ce20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ce30: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
ce40: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
ce50: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
ce60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
ce70: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
ce80: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
ce90: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
cea0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  <pEnd );.  }.}..
ceb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cec0: 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  BUG./*.** Verify
ced0: 20 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20   that pFrame is 
cee0: 61 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d  a valid VdbeFram
cef0: 65 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75  e pointer.  Retu
cf00: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
cf10: 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66  .** and false if
cf20: 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72   something is wr
cf30: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ong..**.** This 
cf40: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e  routine is inten
cf50: 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69  ded for use insi
cf60: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
cf70: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a  tatements only..
cf80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
cf90: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56  beFrameIsValid(V
cfa0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
cfb0: 29 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d  ){.  if( pFrame-
cfc0: 3e 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51  >iFrameMagic!=SQ
cfd0: 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43  LITE_FRAME_MAGIC
cfe0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
cff0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
d000: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  f.../*.** This i
d010: 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f  s a destructor o
d020: 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28  n a Mem object (
d030: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
d040: 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
d050: 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65  ).** that delete
d060: 73 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65  s the Frame obje
d070: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
d080: 68 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62  hed to it as a b
d090: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lob..**.** This 
d0a0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
d0b0: 20 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d   delete the Fram
d0c0: 65 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49  e right away.  I
d0d0: 74 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68  t merely adds th
d0e0: 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20  e.** frame to a 
d0f0: 6c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  list of frames t
d100: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  o be deleted whe
d110: 6e 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73  n the Vdbe halts
d120: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d130: 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c  3VdbeFrameMemDel
d140: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
d150: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
d160: 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29  e = (VdbeFrame*)
d170: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
d180: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d190: 49 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20  IsValid(pFrame) 
d1a0: 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  );.  pFrame->pPa
d1b0: 72 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76  rent = pFrame->v
d1c0: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70  ->pDelFrame;.  p
d1d0: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
d1e0: 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a  ame = pFrame;.}.
d1f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d200: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
d210: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
d220: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
d230: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
d240: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
d250: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
d260: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
d270: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
d280: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
d290: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
d2a0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
d2b0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
d2c0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
d2d0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
d2e0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
d2f0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
d300: 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28  dMem];.  assert(
d310: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d320: 65 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20  eIsValid(p) );. 
d330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d340: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
d350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
d360: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
d370: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
d380: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d390: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
d3a0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
d3b0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
d3c0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
d3d0: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
d3e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d3f0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
d400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d410: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
d420: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
d430: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
d440: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
d450: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
d460: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
d470: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
d480: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
d490: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
d4a0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
d4b0: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
d4c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
d4d0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
d4e0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
d4f0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
d500: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
d510: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
d520: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
d530: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
d540: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
d550: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
d560: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
d570: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
d580: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
d590: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
d5a0: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
d5b0: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
d5c0: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
d5d0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
d5e0: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
d5f0: 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30   PLAN..** 2018-0
d600: 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70  4-24:  In p->exp
d610: 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68  lain==2 mode, th
d620: 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65  e OP_Init opcode
d630: 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a  s of triggers.**
d640: 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c   are also shown,
d650: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75   so that the bou
d660: 6e 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20  ndaries between 
d670: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
d680: 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69   and.** each tri
d690: 67 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a  gger are clear..
d6a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
d6b0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
d6c0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
d6d0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
d6e0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
d6f0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
d700: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
d710: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
d720: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
d730: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d750: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
d760: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
d790: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
d7a0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
d7b0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d7e0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
d7f0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
d800: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
d810: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d820: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
d830: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
d840: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
d870: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
d880: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
d890: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d8a0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
d8b0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
d8c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
d8d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d900: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
d910: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
d940: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
d950: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
d960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
d970: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
d980: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
d990: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28  ListSubprogs = (
d9a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c  p->explain==1 ||
d9b0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
d9c0: 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29  LITE_TriggerEQP)
d9d0: 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20  !=0);.  Op *pOp 
d9e0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d9f0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
da00: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
da10: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
da20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
da30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
da40: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
da50: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
da60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
da70: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
da80: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
da90: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
daa0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
dab0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
dac0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
dad0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
dae0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
daf0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
db00: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
db10: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
db20: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
db30: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
db40: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
db50: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
db60: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
db70: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
db80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
db90: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
dba0: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
dbb0: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
dbc0: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
dbd0: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
dbe0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
dbf0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
dc00: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
dc10: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
dc20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc30: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
dc40: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
dc50: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
dc60: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
dc70: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
dc80: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
dc90: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
dca0: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
dcb0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
dcc0: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
dcd0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
dce0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
dcf0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
dd00: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
dd10: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
dd20: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
dd30: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
dd40: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
dd50: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
dd60: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
dd70: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
dd80: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
dd90: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
dda0: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
ddb0: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
ddc0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
ddd0: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
dde0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
ddf0: 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75  p;.  if( bListSu
de00: 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a  bprogs ){.    /*
de10: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
de20: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
de30: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
de40: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
de50: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
de60: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
de70: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
de80: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
de90: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
dea0: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
deb0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
dec0: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
ded0: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
dee0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
def0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
df00: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
df10: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
df20: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
df30: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
df40: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
df50: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
df60: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
df70: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
df80: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
df90: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
dfa0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
dfb0: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
dfc0: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
dfd0: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
dfe0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
dff0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
e000: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
e010: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
e020: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
e030: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
e040: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
e050: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
e060: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
e070: 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31  }.  }..  while(1
e080: 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74  ){  /* Loop exit
e090: 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20  s via break */. 
e0a0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
e0b0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20      if( i>=nRow 
e0c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
e0d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e0e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
e0f0: 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  NE;.      break;
e100: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e110: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
e120: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
e130: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
e140: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
e150: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
e160: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
e170: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
e180: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
e190: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
e1a0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
e1b0: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
e1c0: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
e1d0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
e1e0: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
e1f0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
e200: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
e210: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
e220: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
e230: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
e240: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
e250: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
e260: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
e270: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
e280: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
e290: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
e2a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68      }..    /* Wh
e2b0: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
e2c0: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
e2d0: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
e2e0: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
e2f0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
e300: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
e310: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
e320: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
e330: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
e340: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
e350: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
e360: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
e370: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
e380: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
e390: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
e3a0: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
e3b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69    */.    if( bLi
e3c0: 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f  stSubprogs && pO
e3d0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
e3e0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
e3f0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
e400: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
e410: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
e420: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
e430: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
e440: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
e450: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
e460: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
e470: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e480: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
e490: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
e4a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
e4b0: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
e4c0: 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20  e, nSub!=0);.   
e4d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
e4e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e4f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e500: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
e510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53     }.        apS
e530: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
e540: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
e550: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
e560: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
e570: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70  ogram;.        p
e580: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
e590: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
e5a0: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
e5b0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
e5c0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  *);.        nRow
e5d0: 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f   += pOp->p4.pPro
e5e0: 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  gram->nOp;.     
e5f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e600: 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20   p->explain<2 ) 
e610: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
e620: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
e630: 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a  xplain ) break;.
e640: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
e650: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
e660: 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b  p->pc>1 ) break;
e670: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
e680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e690: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
e6a0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
e6b0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
e6c0: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
e6d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
e6e0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
e6f0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
e700: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
e710: 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >rc));.    }else
e720: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
e730: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  4;.      if( p->
e740: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
e750: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e760: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e770: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e780: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
e7b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  unter */.       
e7c0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20   pMem++;.    .  
e7d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e7e0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
e7f0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
e800: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
e810: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
e820: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
e830: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
e840: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ode */.        a
e850: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
e860: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 );.        pMe
e870: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
e880: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
e890: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
e8a0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
e8b0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ;.        pMem++
e8c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
e8d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e8e0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
e8f0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
e900: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
e910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e920: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  1 */.      pMem+
e930: 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +;..      pMem->
e940: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
e950: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
e960: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
e990: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
e9a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e9b0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e9c0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
e9d0: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
ea00: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
ea10: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
ea20: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
ea30: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34  m, 100) ){ /* P4
ea40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ea50: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ea60: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ea70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ea80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ea90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
eaa0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
eab0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20  Term;.      zP4 
eac0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
ead0: 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e   pMem->z, pMem->
eae0: 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  szMalloc);.     
eaf0: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
eb00: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  z ){.        pMe
eb10: 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
eb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
eb30: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
eb40: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
eb50: 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  8, 0);.      }el
eb60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
eb70: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
eb80: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
eb90: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
eba0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
ebb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
ebc0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
ebd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
ebe0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
ebf0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
ec00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ec10: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
ec20: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
ec30: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
ec40: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
ec50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ec60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ec70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
ec80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
eca0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
ecb0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
ecc0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 2;.        sql
ecd0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
ece0: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
ecf0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
ed00: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70   P5 */.        p
ed10: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
ed20: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20  E_UTF8;.        
ed30: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66  pMem++;.    .#if
ed40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ed50: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
ed60: 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  TS.        if( s
ed70: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
ed80: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
ed90: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
eda0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
edb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
edc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
edd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
ede0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
edf0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ee00: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
ee10: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
ee20: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
ee30: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
ee40: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
ee50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
ee60: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
ee70: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65  else.        pMe
ee80: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
ee90: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
eea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
eeb0: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
eec0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
eed0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
eee0: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
eef0: 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  -1);.      p->pR
ef00: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
ef10: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d  Mem[1];.      p-
ef20: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
ef30: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ef40: 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20  TE_ROW;.    }.  
ef50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ef60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ef70: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
ef80: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
ef90: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
efa0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
efb0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
efc0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
efd0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
efe0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
eff0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
f000: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
f010: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
f020: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
f030: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
f040: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
f050: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
f060: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
f070: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
f080: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
f090: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
f0a0: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
f0b0: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
f0c0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
f0d0: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
f0e0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
f0f0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
f100: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
f110: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
f120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
f130: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
f140: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
f150: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
f160: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
f170: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
f180: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
f190: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
f1a0: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
f1b0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
f1c0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
f1d0: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
f1e0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
f1f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
f200: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
f210: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
f220: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
f230: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
f240: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
f250: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
f260: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
f270: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f280: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
f290: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
f2a0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
f2b0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
f2c0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
f2d0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
f2e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f2f0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
f300: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f310: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
f320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
f330: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
f340: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f350: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
f360: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
f370: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
f380: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
f390: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
f3a0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
f3b0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
f3c0: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
f3d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
f3e0: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ACE */../* An in
f3f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
f400: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
f410: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  bulk memory avai
f420: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  lable for use.**
f430: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74   by subcomponent
f440: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  s of a prepared 
f450: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63  statement.  Spac
f460: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  e is allocated o
f470: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61  ut.** of a Reusa
f480: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20  bleSpace object 
f490: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63  by the allocSpac
f4a0: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f  e() routine belo
f4b0: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75  w..*/.struct Reu
f4c0: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75  sableSpace {.  u
f4d0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
f4e0: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
f4f0: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73  le memory */.  s
f500: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 46 72  qlite3_int64 nFr
f510: 65 65 3b 20 20 20 2f 2a 20 42 79 74 65 73 20 6f  ee;   /* Bytes o
f520: 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  f available memo
f530: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
f540: 69 6e 74 36 34 20 6e 4e 65 65 64 65 64 3b 20 2f  int64 nNeeded; /
f550: 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68  * Total bytes th
f560: 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  at could not be 
f570: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a  allocated */.};.
f580: 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63  ./* Try to alloc
f590: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
f5a0: 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
f5b0: 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f  d bulk memory fo
f5c0: 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74  r pBuf.** from t
f5d0: 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  he ReusableSpace
f5e0: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
f5f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f600: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d  e allocated.** m
f610: 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73  emory on success
f620: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
f630: 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  nt memory is ava
f640: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  ilable in the.**
f650: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
f660: 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20  bject, increase 
f670: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
f680: 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c  e.nNeeded.** val
f690: 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  ue by the amount
f6a0: 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74 75   needed and retu
f6b0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
f6c0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e  f pBuf is not in
f6d0: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
f6e0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
f6f0: 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72  e memory has alr
f700: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  eady.** been all
f710: 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  ocated by a prio
f720: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  r call to this r
f730: 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20  outine, so just 
f740: 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a  return a copy.**
f750: 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61   of pBuf and lea
f760: 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ve ReusableSpace
f770: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
f780: 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72  * This allocator
f790: 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20   is employed to 
f7a0: 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64  repurpose unused
f7b0: 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e   slots at the en
f7c0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f  d of the.** opco
f7d0: 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65 70  de array of prep
f7e0: 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f  ared state for o
f7f0: 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64  ther memory need
f800: 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65  s of the prepare
f810: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a  d.** statement..
f820: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
f830: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74  allocSpace(.  st
f840: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
f850: 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20  ce *p,  /* Bulk 
f860: 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  memory available
f870: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
f880: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8a0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  * Pointer to a p
f8b0: 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  rior allocation 
f8c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
f8d0: 36 34 20 6e 42 79 74 65 20 20 20 20 20 20 20 2f  64 nByte       /
f8e0: 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
f8f0: 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20  y needed */.){. 
f900: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
f910: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d  YTE_ALIGNMENT(p-
f920: 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66  >pSpace) );.  if
f930: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
f940: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
f950: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
f960: 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65  nByte <= p->nFre
f970: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46  e ){.      p->nF
f980: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
f990: 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70      pBuf = &p->p
f9a0: 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b  Space[p->nFree];
f9b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f9c0: 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20    p->nNeeded += 
f9d0: 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  nByte;.    }.  }
f9e0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
f9f0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
fa00: 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72  pBuf) );.  retur
fa10: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
fa20: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
fa30: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
fa40: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
fa50: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
fa60: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
fa70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
fa80: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
fa90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
faa0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
fab0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
fac0: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
fad0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
fae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
faf0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
fb00: 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69  _INIT || p->magi
fb10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45  c==VDBE_MAGIC_RE
fb20: 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  SET );..  /* The
fb30: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
fb40: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
fb50: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
fb60: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
fb70: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
fb80: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
fb90: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
fba0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
fbb0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
fbc0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
fbd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
fbe0: 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  G.  for(i=0; i<p
fbf0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
fc00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
fc10: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
fc20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
fc30: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
fc40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fc50: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
fc60: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
fc70: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
fc80: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
fc90: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
fca0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
fcb0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
fcc0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
fcd0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
fce0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
fcf0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
fd00: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
fd10: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
fd20: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
fd30: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
fd40: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
fd50: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
fd60: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
fd70: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
fd80: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
fd90: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
fda0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
fdb0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
fdc0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
fdd0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
fde0: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
fdf0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
fe00: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
fe10: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
fe20: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
fe30: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
fe40: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
fe50: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
fe60: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
fe70: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
fe80: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
fe90: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
fea0: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
feb0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
fec0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
fed0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
fee0: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
fef0: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
ff00: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
ff10: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
ff20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
ff30: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
ff40: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
ff50: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
ff60: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
ff70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
ff80: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
ff90: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
ffa0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
ffb0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
ffc0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
ffd0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
ffe0: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
fff0: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
10000 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
10010 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
10020 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
10030 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
10040 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
10050 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
10060 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
10070 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
10080 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
10090 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
100a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
100b0 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
100c0 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
100f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10120 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
10130 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
10140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10150 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10160 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
10170 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
10180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10190 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
101a0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
101d0 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
101e0 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
101f0 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
10200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10210 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
10220 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
10230 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10250 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
10260 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
10270 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ms */.  int n;  
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
102a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75  ounter */.  stru
102b0 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
102c0 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   x;        /* Re
102d0 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f  usable bulk memo
102e0 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ry */..  assert(
102f0 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
10300 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
10310 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
10320 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10330 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
10340 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
10350 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
10360 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62  ->pParse );.  db
10370 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
10380 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
10390 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
103a0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
103b0 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
103c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
103d0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
103e0 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
103f0 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a  se->nMaxArg;.  .
10400 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72    /* Each cursor
10410 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63   uses a memory c
10420 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20  ell.  The first 
10430 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30  cursor (cursor 0
10440 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61  ) can.  ** use a
10450 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20  Mem[0] which is 
10460 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75 73  not otherwise us
10470 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 70  ed by the VDBE p
10480 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74  rogram.  Allocat
10490 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20  e.  ** space at 
104a0 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b  the end of aMem[
104b0 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20  ] for cursors 1 
104c0 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a  and greater..  *
104d0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f  * See also: allo
104e0 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20  cateCursor()..  
104f0 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75  */.  nMem += nCu
10500 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72  rsor;.  if( nCur
10510 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30  sor==0 && nMem>0
10520 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53   ) nMem++;  /* S
10530 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d  pace for aMem[0]
10540 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65   even if not use
10550 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  d */..  /* Figur
10560 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72  e out how much r
10570 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69  eusable memory i
10580 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74  s available at t
10590 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
105a0 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  ** opcode array.
105b0 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d    This extra mem
105c0 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c  ory will be real
105d0 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65  located for othe
105e0 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  r elements.  ** 
105f0 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 20  of the prepared 
10600 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
10610 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a    n = ROUND8(siz
10620 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b  eof(Op)*p->nOp);
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10640 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65   Bytes of opcode
10650 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a   memory used */.
10660 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28    x.pSpace = &((
10670 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20  u8*)p->aOp)[n]; 
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10690 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d   Unused opcode m
106a0 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
106b0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
106c0 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65  IGNMENT(x.pSpace
106d0 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d  ) );.  x.nFree =
106e0 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72   ROUNDDOWN8(pPar
106f0 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20  se->szOpAlloc - 
10700 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66  n);  /* Bytes of
10710 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a   unused memory *
10720 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46  /.  assert( x.nF
10730 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ree>=0 );.  asse
10740 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
10750 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61  LIGNMENT(&x.pSpa
10760 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a  ce[x.nFree]) );.
10770 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
10780 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
10790 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
107a0 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
107b0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
107c0 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
107d0 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
107e0 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
107f0 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
10800 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d  m = 10;.  }.  p-
10810 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
10820 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
10830 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
10840 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
10850 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
10860 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20  in one or two.  
10870 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
10880 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
10890 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
108a0 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20  nused memory at 
108b0 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
108c0 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
108d0 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
108e0 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
108f0 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
10900 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
10910 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
10920 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
10930 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
10940 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
10950 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  ll in the remain
10960 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65 73  der using a fres
10970 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  h memory allocat
10980 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
10990 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
109a0 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
109b0 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
109c0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
109d0 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
109e0 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20  tover memory at 
109f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
10a00 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
10a10 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  is can significa
10a20 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
10a30 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
10a40 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
10a50 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10a60 6e 74 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e 4e 65  nt..  */.  x.nNe
10a70 65 64 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 61  eded = 0;.  p->a
10a80 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
10a90 28 26 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73 69 7a  (&x, 0, nMem*siz
10aa0 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e  eof(Mem));.  p->
10ab0 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
10ac0 65 28 26 78 2c 20 30 2c 20 6e 56 61 72 2a 73 69  e(&x, 0, nVar*si
10ad0 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d  zeof(Mem));.  p-
10ae0 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
10af0 61 63 65 28 26 78 2c 20 30 2c 20 6e 41 72 67 2a  ace(&x, 0, nArg*
10b00 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20  sizeof(Mem*));. 
10b10 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
10b20 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 43  cSpace(&x, 0, nC
10b30 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
10b40 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
10b50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10b60 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
10b70 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61  .  p->anExec = a
10b80 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c  llocSpace(&x, 0,
10b90 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
10ba0 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  64));.#endif.  i
10bb0 66 28 20 78 2e 6e 4e 65 65 64 65 64 20 29 7b 0a  f( x.nNeeded ){.
10bc0 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70      x.pSpace = p
10bd0 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
10be0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
10bf0 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20  b, x.nNeeded);. 
10c00 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e     x.nFree = x.n
10c10 4e 65 65 64 65 64 3b 0a 20 20 20 20 69 66 28 20  Needed;.    if( 
10c20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10c30 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  d ){.      p->aM
10c40 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
10c50 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
10c60 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10c70 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
10c80 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
10c90 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
10ca0 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20  eof(Mem));.     
10cb0 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
10cc0 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
10cd0 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
10ce0 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 20 20 70  (Mem*));.      p
10cf0 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
10d00 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73  pace(&x, p->apCs
10d10 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
10d20 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10d30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10d40 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10d50 54 41 54 55 53 0a 20 20 20 20 20 20 70 2d 3e 61  TATUS.      p->a
10d60 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
10d70 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63  ce(&x, p->anExec
10d80 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
10d90 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
10da0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 56    }.  }..  p->pV
10db0 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70  List = pParse->p
10dc0 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d  VList;.  pParse-
10dd0 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20  >pVList =  0;.  
10de0 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
10df0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
10e00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
10e10 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  iled ){.    p->n
10e20 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Var = 0;.    p->
10e30 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  nCursor = 0;.   
10e40 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->nMem = 0;.  
10e50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43  }else{.    p->nC
10e60 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
10e70 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
10e80 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
10e90 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
10ea0 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20  aVar, nVar, db, 
10eb0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70  MEM_Null);.    p
10ec0 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
10ed0 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
10ee0 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64  p->aMem, nMem, d
10ef0 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  b, MEM_Undefined
10f00 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  );.    memset(p-
10f10 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73  >apCsr, 0, nCurs
10f20 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
10f30 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
10f40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
10f50 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
10f60 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78    memset(p->anEx
10f70 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69  ec, 0, p->nOp*si
10f80 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
10f90 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
10fa0 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
10fb0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
10fc0 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
10fd0 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
10fe0 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
10ff0 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
11000 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
11010 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
11020 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
11030 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
11040 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
11050 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
11060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
11070 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43  x->pBtx==0 || pC
11080 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  x->eCurType==CUR
11090 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
110a0 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75  switch( pCx->eCu
110b0 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  rType ){.    cas
110c0 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  e CURTYPE_SORTER
110d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
110e0 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
110f0 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
11100 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11110 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
11120 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20  E_BTREE: {.     
11130 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65   if( pCx->isEphe
11140 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  meral ){.       
11150 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29   if( pCx->pBtx )
11160 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11170 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20  se(pCx->pBtx);. 
11180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
11190 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
111a0 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
111b0 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
111c0 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
111d0 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
111e0 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
111f0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
11200 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
11210 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
11220 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11230 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
11240 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
11250 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11260 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
11270 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11280 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
11290 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
112a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
112b0 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
112c0 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
112d0 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
112e0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
112f0 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
11300 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
11310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
11320 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
11330 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
11340 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
11350 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
11360 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
11370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11380 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
11390 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
113a0 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
113b0 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
113c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
113d0 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
113e0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
113f0 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
11400 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
11410 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
11420 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
11430 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
11440 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
11450 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
11460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11470 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
11480 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
11490 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
114a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
114b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
114c0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
114d0 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
114e0 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
114f0 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
11500 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
11510 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
11520 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
11530 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
11540 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
11550 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
11560 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
11570 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
11580 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
11590 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
115a0 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
115b0 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
115c0 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
115d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
115e0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
115f0 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
11600 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
11610 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  if.  v->aOp = pF
11620 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
11630 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
11640 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
11650 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
11660 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
11670 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
11680 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
11690 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
116a0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
116b0 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
116c0 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
116d0 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
116e0 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
116f0 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e  ->nChange;.  v->
11700 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46  db->nChange = pF
11710 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b  rame->nDbChange;
11720 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
11730 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64  leteAuxData(v->d
11740 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c  b, &v->pAuxData,
11750 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41   -1, 0);.  v->pA
11760 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d  uxData = pFrame-
11770 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72  >pAuxData;.  pFr
11780 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20  ame->pAuxData = 
11790 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  0;.  return pFra
117a0 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
117b0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
117c0 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
117d0 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
117e0 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
117f0 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
11800 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
11810 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
11820 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
11830 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
11840 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
11850 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
11860 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
11870 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
11880 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
11890 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
118a0 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
118b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
118c0 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
118d0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
118e0 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
118f0 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
11900 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
11910 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
11920 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
11930 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
11940 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
11950 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
11960 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20  ore(pFrame);.   
11970 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
11980 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20      p->nFrame = 
11990 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
119a0 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b   p->nFrame==0 );
119b0 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
119c0 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28  nFrame(p);.  if(
119d0 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
119e0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
119f0 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
11a00 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
11a10 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
11a20 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
11a30 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
11a40 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
11a50 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
11a60 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
11a70 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
11a80 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
11a90 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
11aa0 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
11ab0 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
11ac0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78  */.  if( p->pAux
11ad0 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64  Data ) sqlite3Vd
11ae0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
11af0 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  p->db, &p->pAuxD
11b00 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  ata, -1, 0);.  a
11b10 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
11b20 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
11b30 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
11b40 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
11b50 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
11b60 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
11b70 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
11b80 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
11b90 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
11ba0 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
11bb0 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
11bc0 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
11bd0 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
11be0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
11bf0 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
11c00 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
11c10 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
11c20 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
11c30 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
11c40 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
11c50 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
11c60 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74  esColumn){.  int
11c70 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
11c80 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66  b = p->db;..  if
11c90 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  ( p->nResColumn 
11ca0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
11cb0 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
11cc0 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
11cd0 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
11ce0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11cf0 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
11d00 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73  ;.  }.  n = nRes
11d10 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
11d20 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
11d30 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
11d40 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
11d50 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
11d60 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
11d70 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
11d80 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
11d90 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
11da0 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72  rn;.  initMemArr
11db0 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
11dc0 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  n, db, MEM_Null)
11dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11de0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
11df0 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
11e00 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
11e10 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
11e20 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
11e30 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
11e40 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
11e50 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
11e60 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
11e70 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
11e80 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
11e90 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
11ea0 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
11eb0 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
11ec0 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
11ed0 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
11ee0 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
11ef0 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
11f00 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
11f10 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
11f20 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
11f30 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
11f40 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
11f50 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
11f60 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
11f70 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
11f80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f90 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
11fa0 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
11fd0 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
11fe0 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
12010 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
12020 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
12030 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
12040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12050 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
12060 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
12070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12080 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
12090 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
120a0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
120b0 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
120c0 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
120d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
120e0 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
120f0 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
12100 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
12110 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
12120 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
12130 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
12140 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
12150 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
12160 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
12170 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12180 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
12190 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
121a0 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
121b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
121c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
121d0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
121e0 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
121f0 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
12200 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
12210 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
12220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12230 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
12240 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
12250 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
12260 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
12270 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
12280 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
12290 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
122a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
122b0 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
122c0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
122d0 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
122e0 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
122f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
12300 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
12310 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
12320 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
12330 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
12340 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12350 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
12360 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
12370 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
12380 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
12390 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
123a0 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
123b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
123c0 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
123d0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
123e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
123f0 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
12400 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
12410 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
12420 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
12430 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
12440 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
12450 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
12460 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20  for a two-phase 
12470 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20  commit using a. 
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
124a0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  nal */.  int rc 
124b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
124c0 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
124d0 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
124e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
124f0 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
12500 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
12510 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
12520 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
12530 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
12540 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
12550 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
12560 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12570 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
12580 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
12590 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
125a0 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
125b0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
125c0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
125d0 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
125e0 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
125f0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
12600 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
12610 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
12620 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
12630 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12640 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
12650 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
12660 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
12670 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
12680 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
12690 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
126a0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
126b0 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
126c0 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
126d0 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
126e0 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
126f0 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
12700 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
12710 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
12720 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
12730 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
12740 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
12750 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
12760 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
12770 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
12780 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
12790 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
127a0 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
127b0 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
127c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
127d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
127e0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
127f0 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
12800 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
12810 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
12820 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12830 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12840 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
12850 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
12860 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
12870 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
12880 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
12890 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
128a0 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68   a database migh
128b0 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20  t need a master 
128c0 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20  journal depends 
128d0 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74  upon.      ** it
128e0 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28  s journal mode (
128f0 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e  among other thin
12900 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69  gs).  This matri
12910 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  x determines whi
12920 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  ch.      ** jour
12930 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20  nal modes use a 
12940 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
12950 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20  nd which do not 
12960 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
12970 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64  const u8 aMJNeed
12980 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ed[] = {.       
12990 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20   /* DELETE   */ 
129a0 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   1,.        /* P
129b0 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20  ERSIST   */ 1,. 
129c0 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20         /* OFF   
129d0 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
129e0 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a    /* TRUNCATE  *
129f0 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
12a00 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a  MEMORY    */ 0,.
12a10 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20          /* WAL  
12a20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20       */ 0.      
12a30 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  };.      Pager *
12a40 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67  pPager;   /* Pag
12a50 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
12a60 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20  th pBt */.      
12a70 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
12a80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
12a90 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
12aa0 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
12ab0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
12ac0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
12ad0 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74  db->aDb[i].safet
12ae0 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53  y_level!=PAGER_S
12af0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20  YNCHRONOUS_OFF. 
12b00 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64        && aMJNeed
12b10 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47  ed[sqlite3PagerG
12b20 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
12b30 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20 26 26  ager)].       &&
12b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
12b50 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d 30 0a  emdb(pPager)==0.
12b60 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20        ){ .      
12b70 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20 29    assert( i!=1 )
12b80 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73  ;.        nTrans
12b90 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
12ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12bb0 72 65 65 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  reeExclusiveLock
12bc0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
12bd0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12be0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Bt);.    }.  }..
12bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c00 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
12c10 20 69 66 28 20 64 62 2d 3e 62 43 6f 6e 63 75 72   if( db->bConcur
12c20 72 65 6e 74 20 26 26 20 28 72 63 20 26 20 30 78  rent && (rc & 0x
12c30 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
12c40 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 53 51   ){.    /* An SQ
12c50 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
12c60 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
12c70 54 20 77 61 73 20 65 6e 63 6f 75 6e 74 65 72 65  T was encountere
12c80 64 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20  d while .    ** 
12c90 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 74 61  attempting to ta
12ca0 6b 65 20 74 68 65 20 57 52 49 54 45 52 20 6c 6f  ke the WRITER lo
12cb0 63 6b 20 6f 6e 20 61 20 77 61 6c 20 66 69 6c 65  ck on a wal file
12cc0 2e 20 52 65 6c 65 61 73 65 20 74 68 65 0a 20 20  . Release the.  
12cd0 20 20 2a 2a 20 57 52 49 54 45 52 20 6c 6f 63 6b    ** WRITER lock
12ce0 73 20 6f 6e 20 61 6c 6c 20 77 61 6c 20 66 69 6c  s on all wal fil
12cf0 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20 65 61  es and return ea
12d00 72 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  rly.  */.    for
12d10 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12d20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12d30 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12d40 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12d50 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
12d60 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
12d70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12d80 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
12d90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12da0 33 50 61 67 65 72 44 72 6f 70 45 78 63 6c 75 73  3PagerDropExclus
12db0 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
12dc0 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
12dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12de0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
12df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12e00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
12e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
12e40 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
12e50 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
12e60 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
12e70 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
12e80 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
12e90 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
12ea0 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
12eb0 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
12ec0 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
12ed0 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
12ee0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
12ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
12f00 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
12f10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
12f20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
12f30 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
12f40 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
12f50 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
12f60 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
12f70 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
12f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
12f90 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
12fa0 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
12fb0 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
12fc0 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
12fd0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
12fe0 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
12ff0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
13000 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
13010 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
13020 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
13030 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
13040 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
13050 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
13060 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
13070 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
13080 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
13090 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
130a0 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
130b0 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
130c0 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
130d0 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
130e0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
130f0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
13100 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
13110 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
13120 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
13130 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
13140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
13150 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
13160 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
13170 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
13180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13190 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
131a0 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
131b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
131c0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
131d0 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
131e0 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
131f0 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
13200 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
13210 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
13220 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
13230 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
13240 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
13250 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
13260 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
13270 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
13280 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
13290 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
132a0 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
132b0 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
132c0 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
132d0 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
132e0 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
132f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
13300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13310 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
13320 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
13330 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
13340 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
13350 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
13360 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13370 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
13380 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
13390 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
133a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
133b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
133c0 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
133d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
133e0 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
133f0 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
13400 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
13410 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
13420 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
13430 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
13440 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
13450 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
13460 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
13470 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
13480 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
13490 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
134a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
134b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
134c0 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68  db->pVfs;.    ch
134d0 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
134e0 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
134f0 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
13500 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
13510 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
13520 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
13530 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
13540 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
13550 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
13560 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
13570 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
13580 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
13590 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
135a0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
135b0 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
135c0 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
135d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
135e0 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
135f0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
13600 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
13610 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
13620 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13630 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
13640 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
13650 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
13660 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
13670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13680 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
13690 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
136a0 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
136b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
136c0 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
136d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
136e0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
136f0 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
13700 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
13710 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13720 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
13730 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
13740 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13760 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
13770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13780 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
13790 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
137a0 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
137b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
137c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
137d0 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
137e0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
137f0 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
13800 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
13810 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13820 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
13830 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
13840 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
13870 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
13880 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
13890 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
138a0 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
138b0 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
138c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
138d0 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
138e0 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
138f0 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
13900 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
13910 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
13920 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
13930 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
13940 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
13950 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
13960 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
13970 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
13980 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
13990 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
139a0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
139b0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
139c0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
139d0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
139e0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
139f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13a00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13a10 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
13a20 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
13a30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13a40 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
13a50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
13a60 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
13a70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
13a80 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
13a90 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
13aa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13ab0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
13ac0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
13ad0 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
13ae0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
13af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13b00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13b10 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13b20 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13b30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
13b40 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
13b50 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
13b60 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
13b70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
13b80 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
13b90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13ba0 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
13bb0 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
13bc0 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
13bd0 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
13be0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13bf0 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
13c00 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
13c10 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
13c20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
13c30 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
13c40 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
13c50 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
13c60 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
13c70 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
13c80 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
13c90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13ca0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
13cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
13cc0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
13cd0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
13ce0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
13cf0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
13d00 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
13d10 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
13d20 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
13d30 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
13d40 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
13d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13d60 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
13d70 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
13d80 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
13d90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
13da0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
13db0 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
13dc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13dd0 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
13de0 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
13df0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
13e00 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
13e10 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
13e20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13e30 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
13e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13e60 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
13e70 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
13e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
13e90 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
13ea0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
13eb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13ec0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
13ed0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13ee0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
13ef0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
13f00 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
13f10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13f20 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
13f30 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
13f40 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
13f50 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
13f60 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
13f70 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71  /.    if( 0==(sq
13f80 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
13f90 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
13fa0 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
13fb0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
13fc0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
13fd0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
13fe0 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
13ff0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
14000 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
14010 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
14020 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
14030 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
14040 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
14050 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
14060 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
14070 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
14080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14090 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
140a0 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
140b0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
140c0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
140d0 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
140e0 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
140f0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
14100 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
14110 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
14120 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
14130 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
14140 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
14150 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14160 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
14170 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
14180 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
14190 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
141a0 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
141b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
141c0 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
141d0 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
141e0 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
141f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
14200 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
14210 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
14220 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
14230 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
14240 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
14250 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
14260 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
14270 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
14280 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
14290 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
142a0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
142b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
142c0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
142d0 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
142e0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
142f0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
14300 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
14310 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
14320 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
14330 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
14340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
14350 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
14360 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
14370 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
14380 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
14390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
143a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
143b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
143c0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
143d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
143e0 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
143f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14400 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
14410 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
14420 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
14430 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
14440 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
14450 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
14460 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
14470 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
14480 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
14490 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
144a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
144b0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
144c0 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
144d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
144e0 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
144f0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
14500 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
14510 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
14520 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
14530 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
14540 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
14550 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
14560 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
14570 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
14580 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
14590 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
145a0 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
145b0 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
145c0 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
145d0 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
145e0 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
145f0 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
14600 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
14610 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
14620 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
14630 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
14640 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
14650 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
14660 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
14670 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
14680 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
14690 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
146a0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
146b0 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
146c0 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
146d0 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
146e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
146f0 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
14700 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14710 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
14720 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
14730 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
14740 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
14750 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
14760 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
14770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
14780 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
14790 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
147a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
147b0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
147c0 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
147d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
147e0 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
147f0 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
14800 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
14810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
14820 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14830 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
14840 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
14850 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
14860 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
14870 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
14880 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
14890 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
148a0 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
148b0 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
148c0 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
148d0 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
148e0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
148f0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
14900 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
14910 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
14920 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
14930 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
14940 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
14950 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
14960 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
14970 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
14980 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
14990 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
149a0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
149b0 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
149c0 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
149d0 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
149e0 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
149f0 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
14a00 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
14a10 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
14a20 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
14a30 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
14a40 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
14a50 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
14a60 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
14a70 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
14a80 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
14a90 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
14aa0 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
14ab0 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
14ac0 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
14ad0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
14ae0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
14af0 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
14b00 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
14b10 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
14b20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14b30 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
14b40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
14b50 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
14b60 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
14b70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
14b80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
14b90 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
14ba0 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
14bb0 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
14bc0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
14bd0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
14be0 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
14bf0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14c00 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
14c10 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
14c20 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
14c30 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
14c40 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14c50 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
14c60 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14c70 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
14c80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
14c90 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
14ca0 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
14cb0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
14cc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
14cd0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
14ce0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
14cf0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
14d00 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61  int vdbeCloseSta
14d10 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
14d20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
14d30 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
14d40 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
14d50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14d60 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  nt i;.  const in
14d70 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
14d80 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
14d90 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
14da0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14db0 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
14dc0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
14dd0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
14de0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
14df0 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
14e00 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
14e10 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
14e20 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28  oint) );..  for(
14e30 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
14e40 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72  i++){ .    int r
14e50 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
14e60 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
14e70 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
14e80 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
14e90 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
14ea0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14eb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32  K ){.        rc2
14ec0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
14ed0 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
14ee0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14ef0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
14f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14f10 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
14f20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
14f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
14f40 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
14f50 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
14f60 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
14f70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
14f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14f90 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
14fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14fb0 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d   }.  db->nStatem
14fc0 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61  ent--;.  p->iSta
14fd0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69  tement = 0;..  i
14fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14ff0 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   ){.    if( eOp=
15000 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
15010 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
15020 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
15030 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
15040 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
15050 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
15060 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
15070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
15090 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
150a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
150b0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
150c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
150d0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
150e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
150f0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
15100 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
15110 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
15120 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
15130 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
15140 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
15150 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
15160 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
15170 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
15180 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
15190 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
151a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
151b0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
151c0 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
151d0 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d  DefCons;.    db-
151e0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
151f0 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
15200 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65  mmCons;.  }.  re
15210 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
15220 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
15230 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
15240 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66  , int eOp){.  if
15250 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d  ( p->db->nStatem
15260 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
15270 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75  ment ){.    retu
15280 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  rn vdbeCloseStat
15290 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20  ement(p, eOp);. 
152a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
152b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
152c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
152d0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
152e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
152f0 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
15300 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
15310 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
15320 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
15330 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
15340 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
15350 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
15360 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
15370 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
15380 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
15390 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
153a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
153b0 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
153c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
153d0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
153e0 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
153f0 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
15400 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
15410 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
15420 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
15430 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
15440 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
15450 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
15460 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
15470 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
15480 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
15490 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
154a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
154b0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
154c0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
154d0 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
154e0 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
154f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15500 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
15510 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
15520 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
15530 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
15540 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
15550 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
15560 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
15570 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
15580 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15590 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
155a0 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
155b0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
155c0 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
155d0 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
155e0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
155f0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
15600 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15610 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15620 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15630 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15640 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15650 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
15660 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
15670 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
15680 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
15690 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
156a0 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
156b0 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
156c0 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
156d0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
156e0 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
156f0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
15700 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
15710 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
15720 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
15730 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
15740 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
15750 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
15760 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
15770 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
15780 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
15790 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
157a0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
157b0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
157c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
157d0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
157e0 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
157f0 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
15800 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
15810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
15820 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
15830 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
15840 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
15850 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
15860 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
15870 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
15880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15890 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
158a0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
158d0 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
158e0 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
158f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15900 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
15910 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
15920 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
15930 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
15940 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
15950 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
15960 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
15970 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
15980 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15990 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
159a0 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
159b0 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
159c0 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
159d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
159e0 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
159f0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
15a00 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
15a10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
15a20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
15a30 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
15a40 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
15a50 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
15a60 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
15a70 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
15a80 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
15a90 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
15aa0 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
15ab0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
15ac0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
15ad0 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
15ae0 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
15af0 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
15b00 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
15b10 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
15b20 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
15b30 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
15b40 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
15b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15b60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15b70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15b80 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
15b90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15ba0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  BKPT;.  }.  clos
15bb0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
15bc0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
15bd0 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
15be0 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
15bf0 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
15c00 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
15c10 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
15c20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
15c30 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
15c40 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
15c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
15c60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
15c70 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
15c80 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
15c90 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
15ca0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
15cb0 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
15cc0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
15cd0 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
15ce0 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
15cf0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
15d00 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
15d10 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
15d20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
15d30 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
15d40 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
15d50 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
15d60 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
15d70 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
15d80 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
15d90 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
15da0 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
15db0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
15dc0 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
15dd0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
15de0 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
15e00 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
15e10 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
15e20 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
15e30 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
15e40 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
15e50 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
15e60 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
15e70 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
15e80 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
15e90 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
15ea0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
15eb0 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
15ec0 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
15ed0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
15ee0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
15ef0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
15f00 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
15f10 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
15f20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
15f30 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
15f40 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
15f50 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
15f60 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
15f70 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
15f80 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
15f90 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
15fa0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
15fb0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
15fc0 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
15fd0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
15fe0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
15ff0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
16000 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
16010 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
16020 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
16030 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
16040 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
16050 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
16060 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
16070 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
16080 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
16090 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
160a0 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
160b0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
160c0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
160d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
160e0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
160f0 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
16100 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
16110 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
16120 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
16130 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
16140 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
16150 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
16160 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
16170 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
16180 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
16190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
161a0 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
161b0 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
161c0 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
161d0 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
161e0 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
161f0 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
16200 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
16210 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
16220 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
16230 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
16240 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16250 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16260 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16270 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16280 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
16290 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
162a0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
162b0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
162c0 20 20 20 20 20 20 20 64 62 2d 3e 62 43 6f 6e 63         db->bConc
162d0 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  urrent = 0;.    
162e0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
162f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
16300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
16310 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
16320 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
16330 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
16340 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
16350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16370 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
16380 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16390 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
163a0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
163b0 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
163c0 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
163d0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
163e0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
163f0 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
16400 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
16410 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
16420 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
16430 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
16440 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
16450 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
16460 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
16470 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
16480 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
16490 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
164a0 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
164b0 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
164c0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
164d0 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
164e0 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
164f0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
16500 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16510 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
16520 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
16530 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
16540 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
16550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16560 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
16570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
165a0 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
165b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
165c0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
165d0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
165e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
165f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
16600 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
16610 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
16620 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
16630 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
16640 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16650 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
16660 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
16670 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
16680 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
16690 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
166a0 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
166b0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
166c0 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
166d0 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
166e0 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
166f0 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
16700 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16710 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
16720 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
16730 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
16740 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
16750 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
16760 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
16770 20 20 20 20 20 20 20 20 69 66 28 20 28 72 63 20          if( (rc 
16780 26 20 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  & 0xFF)==SQLITE_
16790 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
167a0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
167b0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
167c0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
167d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
167e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
167f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16800 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
16810 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
16820 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
16830 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
16840 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
16850 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16870 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
16880 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
16890 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
168a0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
168b0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
168c0 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49  gs &= ~(u64)SQLI
168d0 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
168e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
168f0 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
16900 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
16910 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
16920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16930 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16940 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
16950 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16960 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16970 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
16980 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
16990 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
169a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
169b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
169c0 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
169d0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
169e0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
169f0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
16a00 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
16a10 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
16a20 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
16a30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
16a40 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
16a50 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
16a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16a70 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
16a80 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
16a90 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
16aa0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
16ab0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
16ac0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
16ad0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
16ae0 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   1;.        db->
16af0 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 30 3b  bConcurrent = 0;
16b00 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
16b10 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
16b20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16b30 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
16b40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
16b50 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
16b60 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
16b70 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
16b80 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
16b90 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
16ba0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
16bb0 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
16bc0 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
16bd0 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
16be0 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
16bf0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
16c00 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
16c10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
16c20 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
16c30 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
16c40 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
16c50 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
16c60 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
16c70 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
16c80 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
16c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
16ca0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
16cb0 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
16cc0 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
16cd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
16ce0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16cf0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
16d00 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
16d10 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
16d20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
16d30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16d40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16d50 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
16d60 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
16d70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
16d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
16d90 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
16da0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
16db0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
16dc0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
16dd0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
16de0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16df0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62   = 1;.        db
16e00 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20  ->bConcurrent = 
16e10 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  0;.        p->nC
16e20 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16e30 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
16e40 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
16e50 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
16e60 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
16e70 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
16e80 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
16e90 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
16ea0 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
16eb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16ec0 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
16ed0 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
16ee0 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
16ef0 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
16f00 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
16f10 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
16f20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16f30 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
16f40 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
16f50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16f70 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
16f80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
16f90 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16fa0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
16fb0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
16fc0 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
16fd0 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
16fe0 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
16ff0 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
17000 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
17010 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
17020 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
17030 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
17040 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
17050 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
17060 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
17070 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
17080 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
17090 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
170a0 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
170b0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
170c0 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
170d0 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
170e0 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
170f0 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
17100 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17110 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
17120 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
17130 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
17140 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
17150 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
17160 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
17170 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
17180 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
17190 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
171a0 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
171b0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
171c0 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
171d0 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
171e0 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
171f0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
17200 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
17210 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
17220 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
17230 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
17240 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
17250 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
17260 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
17270 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
17280 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
17290 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
172a0 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
172b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
172c0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
172d0 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
172e0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
172f0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
17300 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
17310 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
17320 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
17330 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
17340 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
17350 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
17360 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
17370 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
17380 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
17390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
173a0 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
173b0 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
173c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
173d0 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
173e0 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
173f0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
17400 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
17410 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
17420 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
17430 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
17440 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
17450 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
17460 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
17470 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
17480 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
17490 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
174a0 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
174b0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
174c0 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
174d0 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
174e0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
174f0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
17500 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
17510 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
17520 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
17530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17540 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
17550 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
17560 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
17570 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17580 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
17590 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
175a0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
175b0 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
175c0 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc++;.    sqlite
175d0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
175e0 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62  oc();.    if( db
175f0 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e  ->pErr==0 ) db->
17600 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
17610 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
17620 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
17630 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
17640 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
17650 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
17660 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
17670 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
17680 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
17690 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
176a0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  --;.  }else if( 
176b0 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20  db->pErr ){.    
176c0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e  sqlite3ValueSetN
176d0 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ull(db->pErr);. 
176e0 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65   }.  db->errCode
176f0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
17700 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
17710 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
17720 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
17730 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
17740 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
17750 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
17760 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
17770 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
17780 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
17790 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
177a0 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
177b0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
177c0 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
177d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
177e0 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
177f0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
17800 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
17810 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
17820 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
17830 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
17840 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
17850 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
17860 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
17870 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17880 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
17890 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
178a0 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
178b0 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
178c0 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
178d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
178e0 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
178f0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
17900 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
17910 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
17920 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
17930 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
17940 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
17950 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
17960 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
17970 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
17980 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
17990 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
179a0 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
179b0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
179c0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
179d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
179e0 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
179f0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
17a00 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
17a10 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
17a20 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
17a30 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
17a40 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
17a50 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
17a60 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
17a70 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
17a80 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
17a90 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
17aa0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
17ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17ac0 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
17ad0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
17ae0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
17af0 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
17b00 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
17b10 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 20  ndif..  sqlite3 
17b20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
17b30 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
17b40 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
17b50 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
17b60 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
17b70 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
17b80 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
17b90 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
17ba0 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
17bb0 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
17bc0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
17bd0 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
17be0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
17bf0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20 65 76   has been run ev
17c00 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
17c10 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
17c20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
17c30 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
17c40 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
17c50 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
17c60 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
17c70 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
17c80 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
17c90 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
17ca0 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
17cb0 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
17cc0 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
17cd0 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
17ce0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
17cf0 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
17d00 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
17d10 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
17d20 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
17d30 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
17d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
17d50 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
17d60 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
17d70 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
17d80 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
17d90 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
17da0 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
17db0 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
17dc0 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
17dd0 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
17de0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
17df0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
17e00 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
17e10 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
17e20 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
17e30 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
17e40 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
17e50 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
17e60 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
17e70 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
17e80 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
17e90 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
17ea0 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
17eb0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  p->zErrMsg);.  }
17ec0 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67  ..  /* Reset reg
17ed0 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61  ister contents a
17ee0 6e 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72  nd reclaim error
17ef0 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e   message memory.
17f00 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
17f10 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
17f20 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
17f30 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
17f40 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
17f50 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
17f60 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
17f70 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
17f80 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
17f90 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20  d up.  */.  if( 
17fa0 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
17fb0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
17fc0 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
17fd0 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
17fe0 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
17ff0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
18000 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  <p->nMem; i++) a
18010 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
18020 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
18030 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
18040 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
18050 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
18060 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
18070 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
18080 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66  sultSet = 0;.#if
18090 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
180a0 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30  .  p->nWrite = 0
180b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
180c0 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
180d0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
180e0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
180f0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
18100 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
18110 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
18120 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
18130 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
18140 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
18150 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
18160 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
18170 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
18180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
18190 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
181a0 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
181b0 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
181c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
181d0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
181e0 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
181f0 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
18200 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
18210 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
18220 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
18230 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
18240 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
18250 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
18260 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
18270 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
18280 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
18290 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
182a0 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
182b0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
182c0 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
182d0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
182e0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
182f0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
18300 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
18310 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
18320 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
18330 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
18340 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
18350 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
18360 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
18370 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
18380 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
18390 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
183a0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
183b0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
183c0 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
183d0 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
183e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
183f0 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
18400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18410 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
18420 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
18430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
18440 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
18450 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
18460 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
18470 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74  GIC_RESET;.  ret
18480 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
18490 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
184a0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
184b0 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
184c0 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
184d0 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
184e0 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
184f0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
18500 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
18510 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
18520 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
18530 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
18540 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
18550 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18560 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
18570 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
18580 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
18590 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
185a0 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
185b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
185c0 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
185d0 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
185e0 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
185f0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
18600 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
18610 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18620 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70  If parameter iOp
18630 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
18640 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ro, then invoke 
18650 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
18660 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69  or.** all auxili
18670 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
18680 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  s currently cach
18690 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
186a0 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69  sed as.** the fi
186b0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
186c0 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69  .** Or, if iOp i
186d0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
186e0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
186f0 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75   then the destru
18700 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  ctor is.** only 
18710 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73  invoked for thos
18720 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
18730 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65   pointers create
18740 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a  d by the user .*
18750 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  * function invok
18760 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e  ed by the OP_Fun
18770 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20  ction opcode at 
18780 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20  instruction iOp 
18790 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c  of .** VM pVdbe,
187a0 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69   and only then i
187b0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  f:.**.**    * th
187c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  e associated fun
187d0 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
187e0 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c  is the 32nd or l
187f0 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a  ater (counting.*
18800 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74  *      from left
18810 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a   to right), or.*
18820 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f  *.**    * the co
18830 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
18840 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b  in argument mask
18850 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65   is clear (where
18860 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20   the first.**   
18870 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61     function para
18880 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  meter correspond
18890 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
188a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
188b0 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
188c0 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ta(sqlite3 *db, 
188d0 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e  AuxData **pp, in
188e0 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
188f0 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  {.  while( *pp )
18900 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
18910 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
18920 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
18930 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70  || (pAux->iAuxOp
18940 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20  ==iOp.          
18950 26 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67  && pAux->iAuxArg
18960 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  >=0.          &&
18970 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e   (pAux->iAuxArg>
18980 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d  31 || !(mask & M
18990 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69  ASKBIT32(pAux->i
189a0 41 75 78 41 72 67 29 29 29 29 0a 20 20 20 20 29  AuxArg)))).    )
189b0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
189c0 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d  ( pAux->iAuxArg=
189d0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
189e0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
189f0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  x ){.        pAu
18a00 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41  x->xDeleteAux(pA
18a10 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
18a20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
18a30 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20  Aux->pNextAux;. 
18a40 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18a50 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  ee(db, pAux);.  
18a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18a70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41  p= &pAux->pNextA
18a80 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ux;.    }.  }.}.
18a90 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
18aa0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
18ab0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
18ac0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18ad0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
18ae0 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
18af0 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
18b00 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
18b10 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
18b20 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
18b30 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
18b40 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
18b50 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
18b60 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
18b70 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
18b80 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
18b90 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
18ba0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
18bb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18bc0 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
18bd0 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
18be0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18bf0 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
18c00 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
18c10 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
18c20 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
18c30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
18c40 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
18c50 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
18c60 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
18c70 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
18c80 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
18c90 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
18ca0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
18cb0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
18cc0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
18cd0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
18ce0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
18cf0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
18d00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18d10 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
18d20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
18d30 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
18d40 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
18d50 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
18d60 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71  p->nVar);.    sq
18d70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18d80 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20  p->pVList);.    
18d90 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18da0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d  , p->pFree);.  }
18db0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
18dc0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
18dd0 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
18de0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18df0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
18e00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18e10 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53  >zSql);.#ifdef S
18e20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
18e30 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65 33  MALIZE.  sqlite3
18e40 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e  DbFree(db, p->zN
18e50 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20 20  ormSql);.  {.   
18e60 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 54   DblquoteStr *pT
18e70 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  his, *pNext;.   
18e80 20 66 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70 44   for(pThis=p->pD
18e90 62 6c 53 74 72 3b 20 70 54 68 69 73 3b 20 70 54  blStr; pThis; pT
18ea0 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  his=pNext){.    
18eb0 20 20 70 4e 65 78 74 20 3d 20 70 54 68 69 73 2d    pNext = pThis-
18ec0 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20 20 20 20  >pNextStr;.     
18ed0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18ee0 62 2c 20 70 54 68 69 73 29 3b 0a 20 20 20 20 7d  b, pThis);.    }
18ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
18f00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18f10 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
18f20 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
18f30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18f40 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
18f50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18f60 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
18f70 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
18f80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18f90 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
18fa0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
18fb0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18fc0 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
18fd0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18fe0 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
18ff0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
19000 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
19010 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
19020 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19030 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
19040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
19050 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
19060 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
19070 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
19080 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
19090 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
190a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
190b0 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
190c0 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
190d0 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
190e0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
190f0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
19100 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
19110 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
19120 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
19130 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
19140 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
19150 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  eeNN(db, p);.}..
19160 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
19170 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
19180 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
19190 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
191a0 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
191b0 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
191c0 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
191d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
191e0 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
191f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
19200 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
19210 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
19220 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
19230 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
19240 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
19250 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
19260 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
19270 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
19280 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
19290 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
192a0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
192b0 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
192c0 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
192d0 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
192e0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
192f0 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
19300 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
19310 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
19320 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
19330 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
19340 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
19350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
19360 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
19370 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19380 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
19390 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
193a0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
193b0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
193c0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
193d0 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
193e0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
193f0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
19400 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19410 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
19420 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
19430 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
19440 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
19450 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
19460 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
19470 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
19480 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
19490 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
194a0 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
194b0 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
194c0 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
194d0 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
194e0 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
194f0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
19500 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
19510 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
19520 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
19530 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
19540 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
19550 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
19560 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
19570 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
19580 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
19590 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
195a0 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
195b0 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
195c0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
195d0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
195e0 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
195f0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
19600 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
19610 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
19620 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
19630 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19640 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
19650 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
19660 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
19670 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
19680 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
19690 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
196a0 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
196b0 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
196c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
196d0 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
196e0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
196f0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
19700 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
19710 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
19720 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
19730 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
19740 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
19750 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
19760 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
19770 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
19780 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
19790 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
197a0 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
197b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
197c0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
197d0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
197e0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
197f0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
19800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
19820 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
19830 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
19840 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
19850 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
19860 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
19870 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
19880 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
19890 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
198a0 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
198b0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
198c0 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
198d0 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
198e0 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
198f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
19900 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
19910 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
19920 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
19930 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
19940 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
19950 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
19960 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
19970 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
19980 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
19990 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
199a0 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
199b0 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
199c0 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
199d0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
199e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
199f0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
19a00 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
19a10 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
19a20 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
19a30 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
19a40 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
19a50 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
19a60 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
19a80 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
19a90 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
19aa0 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
19ab0 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
19ac0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
19ad0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
19ae0 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43  E_BTREE || p->eC
19af0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
19b00 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20  PSEUDO );.  if( 
19b10 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
19b20 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  o ){.    int iMa
19b30 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  p;.    if( p->aA
19b40 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d  ltMap && (iMap =
19b50 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70   p->aAltMap[1+*p
19b60 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20  iCol])>0 ){.    
19b70 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
19b80 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69  ursor;.      *pi
19b90 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
19ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19bb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19bc0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
19bd0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
19be0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
19bf0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
19c00 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
19c10 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
19c20 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
19c30 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
19c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
19c60 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
19c70 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
19c80 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
19c90 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
19ca0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
19cb0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19cc0 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
19cd0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
19ce0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
19cf0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
19d00 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
19d10 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
19d20 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
19d30 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
19d40 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
19d50 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
19d60 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
19d70 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
19d80 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
19d90 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
19da0 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
19db0 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
19dc0 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
19dd0 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
19de0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
19df0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
19e00 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
19e10 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
19e20 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
19e30 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
19e40 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
19e50 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
19e60 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
19e70 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
19e80 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
19e90 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
19ea0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
19eb0 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
19ec0 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
19ed0 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
19ee0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
19ef0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
19f00 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
19f10 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
19f20 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
19f30 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
19f40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
19f50 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
19f60 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
19f70 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
19f80 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
19f90 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
19fa0 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
19fb0 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
19fc0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
19fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
19fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19ff0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1a010 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
1a020 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
1a040 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
1a050 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
1a060 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
1a070 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
1a080 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
1a090 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
1a0c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
1a0d0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
1a0f0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
1a100 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
1a110 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
1a120 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
1a130 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
1a140 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
1a170 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
1a180 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
1a190 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
1a1a0 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
1a1b0 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
1a1e0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
1a1f0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1a210 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
1a220 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
1a230 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
1a260 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
1a270 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
1a280 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
1a290 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
1a2a0 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
1a2b0 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
1a2c0 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
1a2d0 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
1a2e0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
1a2f0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
1a300 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
1a310 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
1a320 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
1a330 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
1a340 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
1a350 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
1a360 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
1a370 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
1a380 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
1a390 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
1a3a0 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
1a3b0 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
1a3c0 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
1a3d0 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
1a3e0 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
1a3f0 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
1a400 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
1a410 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
1a420 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
1a430 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1a440 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
1a450 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
1a460 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1a470 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
1a480 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
1a490 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
1a4a0 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
1a4b0 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
1a4c0 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
1a4d0 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
1a4e0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
1a4f0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1a500 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
1a510 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
1a520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a530 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
1a540 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
1a550 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1a560 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
1a570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1a580 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
1a590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a5a0 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
1a5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a5d0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
1a5e0 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
1a5f0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
1a600 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
1a610 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
1a620 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
1a630 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
1a640 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
1a650 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
1a660 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
1a670 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
1a680 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
1a690 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
1a6a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
1a6b0 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
1a6c0 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
1a6d0 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
1a6e0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
1a6f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a700 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
1a710 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
1a720 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
1a730 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
1a740 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
1a750 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
1a760 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
1a770 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
1a780 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
1a790 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
1a7a0 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
1a7b0 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
1a7c0 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
1a7d0 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
1a7e0 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
1a7f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
1a800 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1a810 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
1a820 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
1a830 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
1a840 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
1a850 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
1a860 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
1a870 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
1a880 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
1a890 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
1a8a0 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
1a8b0 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
1a8c0 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
1a8d0 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
1a8e0 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
1a8f0 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
1a900 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
1a910 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
1a920 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
1a930 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
1a940 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
1a950 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
1a960 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
1a970 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
1a980 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
1a990 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
1a9a0 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
1a9b0 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
1a9c0 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
1a9d0 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
1a9e0 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
1a9f0 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
1aa00 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
1aa10 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
1aa20 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
1aa30 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
1aa40 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
1aa50 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
1aa60 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
1aa70 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
1aa80 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
1aa90 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
1aaa0 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
1aab0 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
1aac0 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
1aad0 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
1aae0 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
1aaf0 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
1ab00 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
1ab10 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
1ab20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
1ab30 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
1ab40 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1ab50 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
1ab60 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
1ab70 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
1ab80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
1ab90 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1aba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1abb0 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
1abc0 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
1abd0 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
1abe0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
1abf0 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
1ac00 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
1ac10 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
1ac20 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
1ac30 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
1ac40 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
1ac50 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
1ac60 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
1ac70 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
1ac80 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
1ac90 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
1aca0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1acb0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
1acc0 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
1acd0 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
1ace0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
1acf0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
1ad00 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
1ad10 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
1ad20 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
1ad30 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
1ad40 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
1ad50 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
1ad60 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
1ad70 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
1ad80 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
1ad90 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
1ada0 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
1adb0 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
1adc0 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
1add0 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
1ade0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
1adf0 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
1ae00 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
1ae10 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
1ae20 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
1ae30 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
1ae40 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
1ae50 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
1ae60 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
1ae70 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
1ae80 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
1ae90 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
1aea0 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
1aeb0 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
1aec0 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
1aed0 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
1aee0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
1aef0 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
1af00 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
1af10 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
1af20 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1af30 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1af40 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1af50 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1af60 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1af70 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1af80 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1af90 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1afa0 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1afb0 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1afc0 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1afd0 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1afe0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1aff0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1b000 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1b010 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1b020 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1b030 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1b040 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1b050 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1b060 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1b070 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1b080 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1b090 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1b0a0 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1b0b0 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1b0c0 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1b0d0 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1b0e0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1b0f0 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1b100 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1b110 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1b120 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1b130 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1b140 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1b150 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1b160 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1b170 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1b180 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1b190 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1b1a0 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1b1b0 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1b1c0 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1b1d0 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1b1e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1b1f0 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1b200 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1b210 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1b220 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1b230 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1b240 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1b250 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1b260 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1b270 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1b280 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1b290 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1b2a0 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1b2b0 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1b2c0 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1b2d0 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1b2e0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1b2f0 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1b300 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1b310 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1b320 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1b330 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1b340 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1b350 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b360 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1b370 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1b380 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1b390 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1b3a0 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1b3b0 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1b3c0 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1b3d0 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1b3e0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1b3f0 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1b400 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1b410 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1b420 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1b430 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1b440 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1b450 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1b460 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1b470 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b480 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1b490 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1b4a0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1b4b0 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1b4c0 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1b4d0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1b4e0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1b4f0 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1b500 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1b510 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1b520 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1b530 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1b540 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1b550 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1b560 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1b570 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1b580 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1b590 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1b5a0 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1b5b0 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1b5c0 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1b5d0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1b5e0 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1b5f0 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1b600 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b610 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1b620 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1b630 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1b640 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1b650 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1b660 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1b670 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1b680 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1b690 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1b6a0 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1b6b0 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1b6c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1b6d0 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1b6e0 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1b6f0 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1b700 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1b710 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1b720 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1b730 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1b740 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1b750 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1b760 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b770 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1b780 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1b790 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1b7a0 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1b7b0 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1b7c0 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1b7d0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1b7e0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1b7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1b800 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1b810 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1b820 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1b830 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1b840 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1b850 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1b860 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1b870 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1b880 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1b890 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1b8a0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1b8b0 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1b8c0 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1b8d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1b8e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b8f0 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1b900 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1b910 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1b920 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1b930 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1b940 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1b950 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1b960 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1b970 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1b980 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1b990 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1b9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1b9b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1b9c0 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1b9d0 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1b9e0 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1b9f0 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1ba00 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1ba10 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1ba20 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1ba30 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1ba40 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1ba50 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1ba60 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1ba70 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1ba80 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1ba90 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1baa0 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1bab0 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1bac0 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1bad0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1bae0 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1baf0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1bb00 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1bb10 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bb20 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1bb30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1bb40 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1bb50 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1bb60 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1bb70 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1bb80 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1bb90 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1bba0 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1bbb0 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1bbc0 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1bbd0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1bbe0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1bbf0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1bc00 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1bc10 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1bc20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1bc30 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1bc40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1bc50 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1bc60 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1bc70 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1bc80 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1bc90 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1bca0 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1bcb0 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1bcc0 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1bcd0 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1bce0 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1bcf0 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1bd00 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1bd10 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1bd20 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1bd30 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
1bd40 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
1bd50 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1bd60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1bd70 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1bd80 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1bd90 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1bda0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1bdc0 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1bdd0 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1bde0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1bdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1be00 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1be10 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1be20 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1be30 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1be40 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1be50 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1be60 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1be70 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1be80 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1be90 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1bea0 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1beb0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1bec0 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1bed0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1bee0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1bef0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1bf00 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1bf10 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1bf20 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1bf30 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1bf40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1bf50 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bf60 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1bf70 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1bf80 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1bf90 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1bfa0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1bfb0 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1bfc0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1bfd0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bfe0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1bff0 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1c000 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1c010 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1c020 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1c030 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1c040 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1c050 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1c060 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1c070 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1c080 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1c090 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1c0a0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1c0b0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1c0c0 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1c0d0 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1c0e0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1c0f0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1c100 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1c110 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1c120 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1c130 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1c140 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1c150 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1c160 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1c170 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1c180 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1c190 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1c1a0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1c1b0 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1c1c0 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1c1d0 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1c1e0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1c1f0 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1c200 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1c210 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1c220 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1c230 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1c240 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1c250 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1c260 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1c270 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1c280 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1c290 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c2a0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1c2b0 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1c2c0 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1c2d0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c2f0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1c300 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1c310 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c330 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1c340 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1c350 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1c360 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1c370 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a     case 10: { /*
1c380 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   Internal use on
1c390 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69  ly: NULL with vi
1c3a0 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
1c3b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50             ** UP
1c3c0 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66  DATE no-change f
1c3d0 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  lag set */.     
1c3e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1c3f0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f  EM_Null|MEM_Zero
1c400 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1c410 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
1c420 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  >u.nZero = 0;.  
1c430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c440 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
1c450 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1c460 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1c470 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
1c480 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
1c490 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c4a0 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
1c4b0 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
1c4c0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c4d0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1c4e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c4f0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
1c500 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c510 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
1c520 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
1c530 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
1c540 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
1c550 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1c560 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
1c570 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1c580 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c590 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1c5a0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1c5b0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1c5c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1c5d0 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1c5e0 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1c5f0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c600 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c610 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
1c620 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c630 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
1c640 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1c650 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1c660 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c670 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1c680 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1c690 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c6a0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c6b0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c6c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
1c6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c6e0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1c6f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c700 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c710 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
1c720 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
1c730 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
1c740 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1c750 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1c760 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1c770 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
1c780 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1c790 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c7a0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1c7b0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1c7c0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1c7d0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
1c7e0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1c7f0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1c800 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c810 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c820 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
1c830 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c840 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
1c850 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1c860 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1c870 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c880 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
1c890 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
1c8a0 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
1c8b0 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
1c8c0 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
1c8d0 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
1c8e0 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
1c8f0 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
1c900 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
1c910 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
1c920 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
1c930 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
1c940 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1c950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c960 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1c970 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
1c980 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1c990 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1c9a0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c9b0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c9c0 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
1c9d0 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
1c9e0 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
1c9f0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1ca00 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1ca10 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1ca20 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1ca30 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
1ca40 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1ca50 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1ca60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1ca70 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1ca80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1ca90 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1caa0 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
1cab0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
1cac0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1cad0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1cae0 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
1caf0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
1cb00 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
1cb10 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
1cb20 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
1cb30 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
1cb40 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
1cb50 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
1cb60 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
1cb70 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
1cb80 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1cb90 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1cba0 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
1cbb0 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
1cbc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1cbd0 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
1cbe0 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
1cbf0 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
1cc00 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
1cc10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
1cc20 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
1cc30 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
1cc40 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1cc50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
1cc60 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
1cc70 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
1cc80 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1cc90 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
1cca0 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
1ccb0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1ccc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1ccd0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1cce0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
1ccf0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
1cd00 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
1cd10 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
1cd20 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
1cd30 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
1cd40 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
1cd50 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
1cd60 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
1cd70 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
1cd80 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1cd90 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
1cda0 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
1cdb0 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
1cdc0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
1cdd0 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
1cde0 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
1cdf0 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
1ce00 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
1ce10 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
1ce20 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
1ce30 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1ce40 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
1ce50 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
1ce60 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
1ce70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
1ce80 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
1ce90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
1cea0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ceb0 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
1cec0 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
1ced0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
1cee0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
1cef0 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
1cf00 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
1cf10 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
1cf20 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
1cf30 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
1cf40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1cf50 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
1cf60 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1cf70 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1cf80 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1cf90 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1cfa0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1cfb0 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1cfc0 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1cfd0 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1cfe0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1cff0 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1d000 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1d010 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1d020 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1d030 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1d040 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1d050 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1d060 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1d070 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1d080 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1d090 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1d0a0 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1d0b0 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1d0c0 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1d0d0 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1d0e0 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1d0f0 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1d100 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1d110 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1d120 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1d130 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1d140 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1d150 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1d160 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1d170 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1d180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d190 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1d1a0 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  e record */.){. 
1d1b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1d1c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1d1d0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1d1e0 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1d1f0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d210 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d220 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1d230 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65  or *p */.  nByte
1d240 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1d250 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1d260 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1d270 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  (pKeyInfo->nKeyF
1d280 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28  ield+1);.  p = (
1d290 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d2a0 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1d2b0 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1d2c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1d2d0 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1d2e0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
1d2f0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
1d300 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1d310 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
1d320 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1d330 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1d340 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
1d350 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1d360 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
1d370 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b  nfo->nKeyField +
1d380 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1d390 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1d3a0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1d3b0 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1d3c0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1d3d0 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1d3e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1d3f0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1d400 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1d410 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1d420 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1d430 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1d440 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1d450 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1d460 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1d470 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1d480 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1d490 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1d4a0 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1d4b0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1d4c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1d4d0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1d4e0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1d4f0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1d500 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1d510 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1d520 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1d530 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1d540 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1d550 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1d560 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1d570 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1d580 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d590 72 20 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32 20  r *)pKey;.  u32 
1d5a0 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1d5d0 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1d5e0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1d5f0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1d600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1d610 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1d620 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1d630 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1d640 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1d650 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1d660 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1d670 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1d680 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1d690 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1d6a0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1d6b0 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1d6c0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1d6d0 7a 48 64 72 20 26 26 20 64 3c 3d 28 75 33 32 29  zHdr && d<=(u32)
1d6e0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
1d6f0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1d700 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1d710 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
1d720 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1d730 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
1d740 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1d750 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
1d760 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
1d770 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
1d780 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
1d790 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
1d7a0 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
1d7b0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
1d7c0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
1d7d0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20   pMem->z = 0;.  
1d7e0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
1d7f0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1d800 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
1d810 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
1d820 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
1d830 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
1d840 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1d850 28 20 64 3e 28 75 33 32 29 6e 4b 65 79 20 26 26  ( d>(u32)nKey &&
1d860 20 75 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   u ){.    assert
1d870 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  ( CORRUPT_DB );.
1d880 20 20 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72 72      /* In a corr
1d890 75 70 74 20 72 65 63 6f 72 64 20 65 6e 74 72 79  upt record entry
1d8a0 2c 20 74 68 65 20 6c 61 73 74 20 70 4d 65 6d 20  , the last pMem 
1d8b0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
1d8c0 73 65 74 20 75 70 20 75 73 69 6e 67 20 0a 20 20  set up using .  
1d8d0 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
1d8e0 65 64 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72 77  ed memory. Overw
1d8f0 72 69 74 65 20 69 74 73 20 76 61 6c 75 65 20 77  rite its value w
1d900 69 74 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72 65  ith NULL, to pre
1d910 76 65 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72 6e  vent.    ** warn
1d920 69 6e 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e 20  ings from MSAN. 
1d930 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
1d940 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65  beMemSetNull(pMe
1d950 6d 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  m-1);.  }.  asse
1d960 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1d970 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29  >nKeyField + 1 )
1d980 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1d990 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  u;.}..#ifdef SQL
1d9a0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1d9b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1d9c0 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
1d9d0 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
1d9e0 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
1d9f0 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
1da00 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1da10 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
1da20 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
1da30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
1da40 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1da50 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
1da60 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
1da70 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
1da80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1da90 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
1daa0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
1dab0 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
1dac0 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
1dad0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
1dae0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1daf0 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
1db00 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
1db10 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1db20 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
1db30 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
1db40 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
1db50 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1db60 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
1db70 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
1db80 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
1db90 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
1dba0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
1dbb0 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
1dbc0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1dbd0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1dbe0 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
1dbf0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1dc00 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1dc10 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
1dc20 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
1dc30 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
1dc40 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1dc50 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
1dc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1dc70 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
1dc80 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1dc90 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1dca0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1dcb0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1dcc0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
1dcd0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
1dce0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1dcf0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
1dd00 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1dd10 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1dd20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1dd30 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
1dd40 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1dd50 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
1dd60 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1dd70 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1dd80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1dd90 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
1dda0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
1ddb0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
1ddc0 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1ddd0 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
1dde0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
1ddf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
1de00 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1de10 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
1de20 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1de30 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
1de40 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
1de50 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
1de60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1de70 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
1de80 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1de90 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1dea0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1deb0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1dec0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
1ded0 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
1dee0 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
1def0 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
1df00 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1df10 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
1df20 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
1df30 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
1df40 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
1df50 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
1df60 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
1df70 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
1df80 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
1df90 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
1dfa0 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
1dfb0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
1dfc0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
1dfd0 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
1dfe0 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
1dff0 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
1e000 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
1e010 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
1e020 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
1e030 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
1e040 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
1e050 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1e060 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
1e070 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
1e080 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
1e090 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
1e0a0 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
1e0b0 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
1e0c0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1e0d0 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
1e0e0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1e0f0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69  y1, szHdr1);.  i
1e100 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20  f( szHdr1>98307 
1e110 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e120 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20  CORRUPT;.  d1 = 
1e130 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74  szHdr1;.  assert
1e140 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ( pKeyInfo->nAll
1e150 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1e160 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54  Field || CORRUPT
1e170 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1e180 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1e190 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1e1a0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1e1b0 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20  nKeyField>0 );. 
1e1c0 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1e1d0 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1e1e0 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1e1f0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1e200 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
1e210 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
1e220 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
1e230 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
1e240 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
1e250 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
1e260 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
1e270 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20  l_type1 );..    
1e280 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1e290 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b  here is enough k
1e2a0 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69  ey space remaini
1e2b0 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  ng to avoid.    
1e2c0 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
1e2d0 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73  read.  The "d1+s
1e2e0 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73  erial_type1+2" s
1e2f0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  ubexpression wil
1e300 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  l.    ** always 
1e310 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
1e320 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1e330 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72  amount of requir
1e340 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20  ed key space..  
1e350 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70    ** Use that ap
1e360 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61  proximation to a
1e370 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78  void the more ex
1e380 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a  pensive call to.
1e390 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
1e3a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1e3b0 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ) in the common 
1e3c0 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1e3d0 20 69 66 28 20 64 31 2b 28 75 36 34 29 73 65 72   if( d1+(u64)ser
1e3e0 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36 34  ial_type1+2>(u64
1e3f0 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64  )nKey1.     && d
1e400 31 2b 28 75 36 34 29 73 71 6c 69 74 65 33 56 64  1+(u64)sqlite3Vd
1e410 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1e420 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
1e430 36 34 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  64)nKey1 .    ){
1e440 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e450 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
1e460 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
1e470 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
1e480 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
1e490 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e4a0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e4b0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
1e4c0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
1e4d0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
1e4e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1e4f0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1e500 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
1e510 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20  2->aMem[i],.    
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
1e540 3e 6e 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20 70  >nAllField>i ? p
1e550 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1e560 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ] : 0);.    if( 
1e570 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
1e580 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1e590 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1e5a0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1e5b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
1e5c0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1e5d0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1e5e0 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1e5f0 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1e600 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1e610 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1e620 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1e630 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1e640 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1e650 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1e660 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1e670 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1e680 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1e690 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1e6a0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1e6b0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1e6c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1e6d0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1e6e0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1e6f0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1e700 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1e710 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1e720 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1e730 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1e740 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1e750 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1e760 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1e770 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1e780 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1e790 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1e7a0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1e7b0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1e7c0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1e7d0 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1e7e0 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1e7f0 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1e800 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1e810 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1e820 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1e830 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1e840 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1e850 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1e860 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1e870 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1e880 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1e890 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1e8a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1e8b0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1e8c0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1e8d0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1e8e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1e8f0 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1e900 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1e910 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1e920 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1e930 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1e940 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29  (a.k.a. columns)
1e950 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67   in the record g
1e960 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c  iven by.** pKey,
1e970 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66  nKey.  The verif
1e980 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e  y that this coun
1e990 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
1e9a0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
1e9b0 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79  * limit given by
1e9c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1e9d0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ield..**.** If t
1e9e0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  his constraint i
1e9f0 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c  s not satisfied,
1ea00 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1ea10 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a  he high-speed.**
1ea20 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1ea30 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65  reInt() and vdbe
1ea40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1ea50 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77  ing() routines w
1ea60 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
1ea70 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74  correctly.  If t
1ea80 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65  his assert() eve
1ea90 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62  r fires, it prob
1eaa0 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  ably means.** th
1eab0 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e  at the KeyInfo.n
1eac0 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  KeyField or KeyI
1ead0 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61  nfo.nAllField va
1eae0 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1eaf0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1eb00 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1eb10 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1eb20 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1eb30 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1eb40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1eb50 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1eb60 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1eb70 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1eb80 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1eb90 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1eba0 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1ebb0 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1ebc0 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1ebd0 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1ebe0 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1ebf0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ec00 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1ec10 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ec20 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1ec30 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1ec40 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1ec50 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1ec60 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1ec70 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1ec80 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1ec90 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1eca0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1ecb0 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1ecc0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1ecd0 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1ece0 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1ecf0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1ed00 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  <= pKeyInfo->nAl
1ed10 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73  lField );.}.#els
1ed20 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41  e.# define vdbeA
1ed30 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1ed40 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c  ithinLimits(A,B,
1ed50 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  C).#endif../*.**
1ed60 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64   Both *pMem1 and
1ed70 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20   *pMem2 contain 
1ed80 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43  string values. C
1ed90 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76  ompare the two v
1eda0 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74  alues.** using t
1edb0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1edc0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20  uence pColl. As 
1edd0 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20  usual, return a 
1ede0 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a  negative , zero.
1edf0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76  ** or positive v
1ee00 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69  alue if *pMem1 i
1ee10 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1ee20 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
1ee30 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32   than .** *pMem2
1ee40 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1ee50 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69  Similar in spiri
1ee60 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65  t to "rc = (*pMe
1ee70 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22  m1) - (*pMem2);"
1ee80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ee90 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1eea0 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65  ring(.  const Me
1eeb0 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73  m *pMem1,.  cons
1eec0 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20  t Mem *pMem2,.  
1eed0 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1eee0 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45  Coll,.  u8 *prcE
1eef0 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
1ef00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
1ef10 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74   OOM occurs, set
1ef20 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1ef30 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65   */.){.  if( pMe
1ef40 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e  m1->enc==pColl->
1ef50 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  enc ){.    /* Th
1ef60 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c  e strings are al
1ef70 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72  ready in the cor
1ef80 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20  rect encoding.  
1ef90 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a  Call the.     **
1efa0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1efb0 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f  tion directly */
1efc0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  .    return pCol
1efd0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
1efe0 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d  User,pMem1->n,pM
1eff0 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c  em1->z,pMem2->n,
1f000 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c  pMem2->z);.  }el
1f010 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
1f020 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
1f030 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d  v1, *v2;.    Mem
1f040 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b   c1;.    Mem c2;
1f050 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f060 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65  MemInit(&c1, pMe
1f070 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1f080 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f090 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70  beMemInit(&c2, p
1f0a0 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1f0b0 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1f0c0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1f0d0 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
1f0e0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
1f0f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1f100 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
1f110 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
1f120 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
1f130 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1f140 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
1f150 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1f160 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1f170 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1f180 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1f190 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28  l->enc);.    if(
1f1a0 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30   (v1==0 || v2==0
1f1b0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1f1c0 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20  rcErr ) *prcErr 
1f1d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1f1e0 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  KPT;.      rc = 
1f1f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1f200 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e      rc = pColl->
1f210 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1f220 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e  r, c1.n, v1, c2.
1f230 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20  n, v2);.    }.  
1f240 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f250 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
1f260 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f270 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
1f280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1f290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  .}../*.** The in
1f2a0 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61  put pBlob is gua
1f2b0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
1f2c0 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74  Blob that is not
1f2d0 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20   marked.** with 
1f2e0 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72  MEM_Zero.  Retur
1f2f0 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75  n true if it cou
1f300 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f  ld be a zero-blo
1f310 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
1f320 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74   isAllZero(const
1f330 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
1f340 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1f350 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
1f360 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20  .    if( z[i] ) 
1f370 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f380 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
1f390 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
1f3a0 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
1f3b0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1f3c0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1f3d0 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
1f3e0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1f3f0 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1f400 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
1f410 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
1f420 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
1f430 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
1f440 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
1f450 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
1f460 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e  sor..*/.SQLITE_N
1f470 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
1f480 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
1f490 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
1f4a0 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
1f4b0 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
1f4c0 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e  1 = pB1->n;.  in
1f4d0 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a  t n2 = pB2->n;..
1f4e0 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
1f4f0 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c  ble to have a Bl
1f500 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  ob value that ha
1f510 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20  s some non-zero 
1f520 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c  content.  ** fol
1f530 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f  lowed by zero co
1f540 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74  ntent.  But that
1f550 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66   only comes up f
1f560 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a  or Blobs formed.
1f570 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d    ** by the OP_M
1f580 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1f590 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73  , and such Blobs
1f5a0 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65   never get passe
1f5b0 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
1f5c0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e  te3MemCompare().
1f5d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1f5e0 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1f5f0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d  Zero)==0 || n1==
1f600 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1f610 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1f620 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d  _Zero)==0 || n2=
1f630 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42  =0 );..  if( (pB
1f640 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c  1->flags|pB2->fl
1f650 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  ags) & MEM_Zero 
1f660 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e  ){.    if( pB1->
1f670 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61  flags & pB2->fla
1f680 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1f690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1f6a0 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32  1->u.nZero - pB2
1f6b0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1f6c0 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c  else if( pB1->fl
1f6d0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1f6e0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1f6f0 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70  llZero(pB2->z, p
1f700 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B2->n) ) return 
1f710 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1f720 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1f730 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n2;.    }else{. 
1f740 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1f750 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d  ero(pB1->z, pB1-
1f760 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  >n) ) return +1;
1f770 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31  .      return n1
1f780 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1f790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d  .    }.  }.  c =
1f7a0 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1f7b0 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20  pB2->z, n1>n2 ? 
1f7c0 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20  n2 : n1);.  if( 
1f7d0 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1f7e0 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a  return n1 - n2;.
1f7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1f800 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1f810 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1f820 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1f830 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
1f840 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
1f850 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1f860 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1f870 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1f880 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
1f890 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
1f8a0 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1f8b0 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
1f8c0 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
1f8d0 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
1f8e0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
1f8f0 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
1f900 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
1f910 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
1f920 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
1f930 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
1f940 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
1f950 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
1f960 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
1f970 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1f980 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1f990 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
1f9a0 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
1f9b0 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
1f9c0 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1f9d0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1f9e0 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32 30   if( r>=92233720
1f9f0 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20  36854775808.0 ) 
1fa00 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79  return -1;.    y
1fa10 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69   = (i64)r;.    i
1fa20 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20  f( i<y ) return 
1fa30 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20  -1;.    if( i>y 
1fa40 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1fa50 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a   s = (double)i;.
1fa60 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65      if( s<r ) re
1fa70 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1fa80 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   s>r ) return +1
1fa90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1faa0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d    }.}../*.** Com
1fab0 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1fac0 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1fad0 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1fae0 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1faf0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1fb00 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1fb10 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1fb20 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1fb30 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1fb40 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1fb50 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1fb60 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1fb70 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1fb80 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1fb90 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1fba0 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1fbb0 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1fbc0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1fbd0 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1fbe0 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1fbf0 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1fc00 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1fc10 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1fc20 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1fc30 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1fc40 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1fc50 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1fc60 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1fc70 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1fc80 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1fc90 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1fca0 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1fcb0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1fcc0 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1fcd0 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1fce0 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1fcf0 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1fd00 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  2;.  assert( !sq
1fd10 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f  lite3VdbeMemIsRo
1fd20 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20 21  wSet(pMem1) && !
1fd30 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73  sqlite3VdbeMemIs
1fd40 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29 3b  RowSet(pMem2) );
1fd50 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1fd60 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1fd70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1fd80 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1fd90 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1fda0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1fdb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1fdc0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1fdd0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1fde0 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1fdf0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1fe00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65  .  }..  /* At le
1fe10 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  ast one of the t
1fe20 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e  wo values is a n
1fe30 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28  umber.  */.  if(
1fe40 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1fe50 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
1fe60 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  l) ){.    if( (f
1fe70 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  1 & f2 & MEM_Int
1fe80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1fe90 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
1fea0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1feb0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1fec0 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d   pMem1->u.i > pM
1fed0 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1fee0 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1fef0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1ff00 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1ff10 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1ff20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1ff30 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r < pMem2->u.r
1ff40 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1ff50 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1ff60 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r > pMem2->u.r 
1ff70 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1ff80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ff90 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
1ffa0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1ffb0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1ffc0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1ffd0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1ffe0 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1fff0 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d  e(pMem1->u.i, pM
20000 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em2->u.r);.     
20010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20020 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
20030 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
20040 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
20050 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
20060 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
20070 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
20080 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61   -sqlite3IntFloa
20090 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e  tCompare(pMem2->
200a0 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29  u.i, pMem1->u.r)
200b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
200c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
200d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
200e0 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20      return +1;. 
200f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
20100 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
20110 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
20120 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
20130 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
20140 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
20150 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
20160 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
20170 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
20180 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
20190 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
201a0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
201b0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
201c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
201d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
201e0 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
201f0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
20200 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
20210 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
20220 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
20230 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61  || pMem1->db->ma
20240 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
20250 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
20260 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
20270 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  8 || .          
20280 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51    pMem1->enc==SQ
20290 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20  LITE_UTF16LE || 
202a0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
202b0 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20  TE_UTF16BE );.. 
202c0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
202d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ion sequence mus
202e0 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20  t be defined at 
202f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e  this point, even
20300 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75   if.    ** the u
20310 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20  ser deletes the 
20320 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
20330 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62  ce after the vdb
20340 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20  e program is.   
20350 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68   ** compiled (th
20360 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79  is was not alway
20370 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20  s the case)..   
20380 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
20390 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d  !pColl || pColl-
203a0 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66  >xCmp );..    if
203b0 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
203c0 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70   return vdbeComp
203d0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65  areMemString(pMe
203e0 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c  m1, pMem2, pColl
203f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
20400 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69  /* If a NULL poi
20410 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20  nter was passed 
20420 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66  as the collate f
20430 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68  unction, fall th
20440 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20  rough.    ** to 
20450 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e  the blob case an
20460 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20  d use memcmp(). 
20470 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42   */.  }. .  /* B
20480 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20  oth values must 
20490 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61  be blobs.  Compa
204a0 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  re using memcmp(
204b0 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ).  */.  return 
204c0 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
204d0 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29  re(pMem1, pMem2)
204e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
204f0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
20500 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
20510 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
20520 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
20530 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
20540 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
20550 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
20560 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
20570 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
20580 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
20590 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
205a0 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
205b0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
205c0 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
205d0 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
205e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
205f0 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
20600 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
20610 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
20620 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
20630 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
20640 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
20650 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
20660 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
20670 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
20680 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
20690 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
206a0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
206b0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
206c0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
206d0 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
206e0 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
206f0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20700 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20710 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
20720 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
20730 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20740 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
20750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
20760 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
20770 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
20780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
20790 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
207a0 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
207b0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
207c0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
207d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
207e0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
207f0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
20800 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
20810 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
20820 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
20830 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
20840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20850 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
20860 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
20870 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
20880 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
20890 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
208a0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
208b0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
208c0 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
208d0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
208e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
208f0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
20900 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
20910 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
20920 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
20930 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
20940 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
20950 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
20960 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
20970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20980 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
20990 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
209a0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
209b0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
209c0 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
209d0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
209e0 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
209f0 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
20a00 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
20a10 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
20a20 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
20a30 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
20a40 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
20a50 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
20a60 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
20a70 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
20a80 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
20a90 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68  ord opcode of th
20aa0 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b  e VDBE.  The pPK
20ab0 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20  ey2.** key must 
20ac0 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20  be a parsed key 
20ad0 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64  such as obtained
20ae0 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
20af0 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e  VdbeParseRecord.
20b00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
20b10 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  nt bSkip is non-
20b20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
20b30 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
20b40 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ler has already.
20b50 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  ** determined th
20b60 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65  at the first fie
20b70 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20  lds of the keys 
20b80 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a  are equal..**.**
20b90 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
20ba0 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
20bb0 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
20bc0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
20bd0 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c   If all .** fiel
20be0 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ds that appear i
20bf0 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20  n both keys are 
20c00 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65  equal, then pPKe
20c10 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
20c20 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
20c30 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73  **.** If databas
20c40 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
20c50 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20  discovered, set 
20c60 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
20c70 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  to .** SQLITE_CO
20c80 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e  RRUPT and return
20c90 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72   0. If an OOM er
20ca0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
20cb0 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e  ed, .** pPKey2->
20cc0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74  errCode is set t
20cd0 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
20ce0 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nd, if it is not
20cf0 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61   NULL, the.** ma
20d00 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
20d10 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65   set on database
20d20 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d   handle (pPKey2-
20d30 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a  >pKeyInfo->db)..
20d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
20d50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
20d60 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e  ithSkip(.  int n
20d70 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
20d80 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
20d90 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
20da0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
20db0 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2,         /* R
20dc0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
20dd0 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20df0 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74   If true, skip t
20e00 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a  he first field *
20e10 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
20e40 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
20e50 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
20e60 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
20e90 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f  of next field to
20ea0 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33   compare */.  u3
20eb0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ed0 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
20ee0 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20  header in bytes 
20ef0 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
20f20 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20  f first type in 
20f30 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
20f40 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
20f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20f60 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
20f70 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b   Mem *pRhs = pPK
20f80 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  ey2->aMem;      
20f90 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f   /* Next field o
20fa0 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70  f pPKey2 to comp
20fb0 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  are */.  KeyInfo
20fc0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f   *pKeyInfo;.  co
20fd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
20fe0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
20ff0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
21000 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d  *)pKey1;.  Mem m
21010 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53  em1;..  /* If bS
21020 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65  kip is true, the
21030 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  n the caller has
21040 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69   already determi
21050 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
21060 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  st.  ** two elem
21070 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73  ents in the keys
21080 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20   are equal. Fix 
21090 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63  the various stac
210a0 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20  k variables so. 
210b0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f   ** that this ro
210c0 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d  utine begins com
210d0 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65  paring at the se
210e0 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  cond field. */. 
210f0 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20   if( bSkip ){.  
21100 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64    u32 s1;.    id
21110 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69  x1 = 1 + getVari
21120 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
21130 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20  s1);.    szHdr1 
21140 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20  = aKey1[0];.    
21150 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71  d1 = szHdr1 + sq
21160 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
21170 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20  ypeLen(s1);.    
21180 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b  i = 1;.    pRhs+
21190 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
211a0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
211b0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
211c0 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  );.    d1 = szHd
211d0 72 31 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20  r1;.    i = 0;. 
211e0 20 7d 0a 20 20 69 66 28 20 64 31 3e 28 75 6e 73   }.  if( d1>(uns
211f0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a  igned)nKey1 ){ .
21200 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21210 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21220 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21230 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
21240 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
21250 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   }..  VVA_ONLY( 
21260 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
21270 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
21280 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
21290 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
212a0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
212b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
212c0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
212d0 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
212e0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
212f0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
21300 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
21310 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
21320 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
21330 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e  Info->nKeyField>
21340 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
21350 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
21360 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
21370 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
21380 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
21390 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
213a0 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
213b0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
213c0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
213d0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
213e0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
213f0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
21400 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
21410 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
21420 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =10 ){.        r
21430 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
21440 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
21450 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
21460 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
21470 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
21480 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
21490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
214a0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
214b0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
214c0 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
214d0 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33     rc = -sqlite3
214e0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
214f0 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e  pRhs->u.i, mem1.
21500 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
21510 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
21520 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
21530 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
21540 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
21550 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
21560 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
21570 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
21580 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
21590 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
215a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
215b0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
215c0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
215d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
215e0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
215f0 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
21600 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
21610 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
21620 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
21630 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
21640 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
21650 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
21660 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
21670 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61  types 12 or grea
21680 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20  ter are strings 
21690 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74  and blobs (great
216a0 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20  er than.        
216b0 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70  ** numbers). Typ
216c0 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65  es 10 and 11 are
216d0 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65   currently "rese
216e0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
216f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22  .        ** use"
21700 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
21710 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68  really matter wh
21720 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  at the results o
21730 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20  f comparing.    
21740 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e      ** them to n
21750 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61  umberic values a
21760 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  re.  */.        
21770 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
21780 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
21790 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
217a0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
217b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
217c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
217d0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
217e0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
217f0 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
21800 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
21810 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  7 ){.          i
21820 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73  f( mem1.u.r<pRhs
21830 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
21840 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
21850 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
21860 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d  ( mem1.u.r>pRhs-
21870 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
21880 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
21890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
218a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
218b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
218c0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65  tFloatCompare(me
218d0 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e  m1.u.i, pRhs->u.
218e0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
218f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21900 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72   /* RHS is a str
21910 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ing */.    else 
21920 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
21930 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
21940 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
21950 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
21960 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
21970 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
21980 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
21990 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
219a0 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ype<12 ){.      
219b0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
219c0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
219d0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
219e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
219f0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
21a00 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e  {.        mem1.n
21a10 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
21a20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
21a30 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
21a40 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67  +mem1.n)==(unsig
21a50 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
21a60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21a70 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75  d1+mem1.n+1)==(u
21a80 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
21a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
21aa0 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69  +mem1.n) > (unsi
21ab0 67 6e 65 64 29 6e 4b 65 79 31 0a 20 20 20 20 20  gned)nKey1.     
21ac0 20 20 20 20 7c 7c 20 28 70 4b 65 79 49 6e 66 6f      || (pKeyInfo
21ad0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
21ae0 6e 66 6f 29 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c  nfo)->nAllField<
21af0 3d 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =i.        ){.  
21b00 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
21b10 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
21b20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21b30 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
21b40 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21b50 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
21b60 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
21b70 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
21b80 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
21b90 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e           mem1.en
21ba0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
21bb0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  c;.          mem
21bc0 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
21bd0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  >db;.          m
21be0 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em1.flags = MEM_
21bf0 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  Str;.          m
21c00 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26  em1.z = (char*)&
21c10 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20  aKey1[d1];.     
21c20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
21c30 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d                &m
21c50 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49  em1, pRhs, pKeyI
21c60 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26  nfo->aColl[i], &
21c70 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a  pPKey2->errCode.
21c80 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
21c90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21ca0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
21cb0 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68   MIN(mem1.n, pRh
21cc0 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
21cd0 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
21ce0 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
21cf0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
21d00 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
21d10 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68  c = mem1.n - pRh
21d20 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d  s->n; .        }
21d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21d40 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
21d50 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65  blob */.    else
21d60 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
21d70 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20   & MEM_Blob ){. 
21d80 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
21d90 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
21da0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73  Zero)==0 || pRhs
21db0 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->n==0 );.      
21dc0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
21dd0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
21de0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
21df0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
21e00 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
21e10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
21e20 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
21e30 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
21e40 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
21e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21e60 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
21e70 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
21e80 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
21e90 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
21ea0 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
21eb0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
21ec0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
21ed0 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
21ee0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
21ef0 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
21f00 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
21f10 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
21f20 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
21f30 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
21f40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
21f50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f70 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
21f80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21f90 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
21fa0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
21fb0 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
21fc0 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  ro((const char*)
21fd0 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29  &aKey1[d1],nStr)
21fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21ff0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
22000 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22010 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d       rc = nStr -
22020 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRhs->u.nZero;.
22030 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22050 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
22060 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e  MIN(nStr, pRhs->
22070 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
22080 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
22090 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
220a0 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
220b0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
220c0 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b   nStr - pRhs->n;
220d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
220e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
220f0 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a   RHS is null */.
22100 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
22110 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
22120 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
22130 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79   rc = (serial_ty
22140 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  pe!=0);.    }.. 
22150 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
22160 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
22170 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
22180 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
22190 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
221a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
221b0 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
221c0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
221d0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
221e0 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
221f0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
22200 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
22210 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
22220 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
22230 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
22240 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  i++;.    if( i==
22250 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
22260 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 68 73   break;.    pRhs
22270 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71  ++;.    d1 += sq
22280 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
22290 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
222a0 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d  pe);.    idx1 +=
222b0 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
222c0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
222d0 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28    }while( idx1<(
222e0 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20  unsigned)szHdr1 
222f0 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64  && d1<=(unsigned
22300 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20  )nKey1 );..  /* 
22310 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
22320 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
22330 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
22340 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
22350 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
22360 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
22370 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
22380 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
22390 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
223a0 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
223b0 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
223c0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
223d0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
223e0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
223f0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
22400 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
22410 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   one or both of 
22420 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
22430 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
22440 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
22450 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
22460 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
22470 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75  Return the defau
22480 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
22490 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
224a0 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20  CORRUPT_DB .    
224b0 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64     || vdbeRecord
224c0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
224d0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
224e0 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  2, pPKey2->defau
224f0 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c  lt_rc) .       |
22500 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
22510 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
22520 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65  iled.  );.  pPKe
22530 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
22540 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d    return pPKey2-
22550 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69  >default_rc;.}.i
22560 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
22570 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69  cordCompare(.  i
22580 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
22590 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
225a0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
225b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
225c0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20  pPKey2          
225d0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
225e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
225f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22600 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
22610 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22620 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2, 0);.}.../*.**
22630 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22640 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
22650 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
22660 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22670 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
22680 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
22690 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
226a0 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28  n integer, and (
226b0 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d  b) the .** size-
226c0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
226d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
226e0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
226f0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a  its in a single.
22700 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  ** byte (i.e. is
22710 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e   less than 128).
22720 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
22730 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62  concerns about b
22740 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c  uffer overreads,
22750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22760 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e   only used.** on
22770 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74   schemas where t
22780 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64  he maximum valid
22790 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
227a0 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  63 bytes or less
227b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
227c0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
227d0 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79  eInt(.  int nKey
227e0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
227f0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
22800 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
22810 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
22820 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
22830 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
22840 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f  u8 *aKey = &((co
22850 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a  nst u8*)pKey1)[*
22860 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
22870 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20   & 0x3F];.  int 
22880 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28  serial_type = ((
22890 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
228a0 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  [1];.  int res;.
228b0 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78    u32 y;.  u64 x
228c0 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34  ;.  i64 v;.  i64
228d0 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73   lhs;..  vdbeAss
228e0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
228f0 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
22900 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
22910 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73  pKeyInfo);.  ass
22920 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79  ert( (*(u8*)pKey
22930 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52  1)<=0x3F || CORR
22940 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74  UPT_DB );.  swit
22950 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
22960 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b  ){.    case 1: {
22970 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
22980 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
22990 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54     lhs = ONE_BYT
229a0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
229b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
229c0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
229d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
229e0 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
229f0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
22a00 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
22a10 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
22a20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22a30 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
22a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
22a50 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
22a60 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
22a70 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
22a80 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  hs = THREE_BYTE_
22a90 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
22aa0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
22ab0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
22ac0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22ad0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
22ae0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
22af0 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
22b00 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
22b10 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36  .      lhs = (i6
22b20 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
22b30 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
22b40 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
22b50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
22b60 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
22b70 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
22b80 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46  */.      lhs = F
22b90 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
22ba0 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
22bb0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
22bc0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
22bd0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
22be0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
22bf0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22c00 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73  6: { /* 8-byte s
22c10 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
22c20 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f  .      x = FOUR_
22c30 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
22c40 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
22c50 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
22c60 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
22c70 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29     lhs = *(i64*)
22c80 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &x;.      testca
22c90 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
22ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22cb0 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20      case 8: .   
22cc0 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20     lhs = 0;.    
22cd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
22ce0 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d  e 9:.      lhs =
22cf0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
22d00 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  ..    /* This ca
22d10 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f  se could be remo
22d20 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e  ved without chan
22d30 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ging the results
22d40 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20   of running.    
22d50 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e  ** this code. In
22d60 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65  cluding it cause
22d70 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74  s gcc to generat
22d80 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63  e a faster switc
22d90 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  h .    ** statem
22da0 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72  ent (since the r
22db0 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74  ange of switch t
22dc0 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74  argets now start
22dd0 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20  s at zero and.  
22de0 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f    ** is contiguo
22df0 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  us) but does not
22e00 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69   cause any dupli
22e10 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20  cate code to be 
22e20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a  generated.    **
22e30 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76   (as gcc is clev
22e40 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d  er enough to com
22e50 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b  bine the two lik
22e60 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20  e cases). Other 
22e70 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72  .    ** compiler
22e80 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c  s might be simil
22e90 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  ar.  */ .    cas
22ea0 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20  e 0: case 7:.   
22eb0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
22ec0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22ed0 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
22ee0 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64   pPKey2);..    d
22ef0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
22f00 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
22f10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
22f20 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
22f30 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  y2);.  }..  v = 
22f40 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
22f50 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73  u.i;.  if( v>lhs
22f60 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
22f70 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
22f80 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
22f90 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
22fa0 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
22fb0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
22fc0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
22fd0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
22fe0 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
22ff0 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
23000 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
23010 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
23020 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
23030 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23040 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
23050 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
23060 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
23070 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
23080 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
23090 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
230a0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
230b0 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
230c0 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
230d0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
230e0 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
230f0 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
23100 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
23110 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  c;.    pPKey2->e
23120 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  qSeen = 1;.  }..
23130 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
23140 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
23150 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
23160 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20  PKey2, res) );. 
23170 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
23180 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23190 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
231a0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
231b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
231c0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
231d0 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
231e0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
231f0 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
23200 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74  at (b) the first
23210 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74   field.** uses t
23220 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
23230 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64  uence BINARY and
23240 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69   (c) that the si
23250 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
23260 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73  int .** at the s
23270 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
23280 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
23290 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a  single byte..*/.
232a0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
232b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
232c0 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ng(.  int nKey1,
232d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
232e0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
232f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
23300 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
23310 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
23320 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
23330 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
23340 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e   u8*)pKey1;.  in
23350 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  t serial_type;. 
23360 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73   int res;..  ass
23370 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  ert( pPKey2->aMe
23380 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[0].flags & MEM
23390 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73  _Str );.  vdbeAs
233a0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
233b0 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
233c0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
233d0 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
233e0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
233f0 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
23400 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
23410 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
23420 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
23430 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
23440 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
23450 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
23460 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
23470 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
23480 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
23490 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
234a0 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
234b0 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
234c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
234d0 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
234e0 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
234f0 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
23500 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
23510 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
23520 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
23530 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
23540 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
23550 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
23560 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23570 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
23580 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
23590 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
235a0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
235b0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
235c0 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
235d0 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
235e0 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
235f0 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
23600 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
23610 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
23620 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
23630 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
23640 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
23650 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
23660 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
23670 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73           res = s
23680 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
23690 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
236a0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
236b0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
236c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
236d0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
236e0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
236f0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
23700 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  qSeen = 1;.     
23710 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
23720 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
23730 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
23740 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65  y2->r2;.      }e
23750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
23760 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
23770 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
23780 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
23790 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
237a0 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r2;.    }else{
237b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
237c0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20  ey2->r1;.    }. 
237d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
237e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
237f0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
23800 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a  1, pPKey2, res).
23810 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
23820 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
23830 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
23840 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
23850 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
23860 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
23870 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23880 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
23890 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
238a0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
238b0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
238c0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
238d0 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
238e0 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
238f0 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
23900 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
23910 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
23920 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
23930 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
23940 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
23950 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
23960 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
23970 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
23980 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
23990 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
239a0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
239b0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
239c0 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
239d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
239e0 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
239f0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
23a00 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
23a10 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
23a20 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
23a30 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
23a40 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
23a50 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
23a60 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
23a70 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
23a80 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
23a90 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
23aa0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
23ab0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
23ac0 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
23ad0 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
23ae0 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
23af0 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
23b00 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
23b10 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
23b20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
23b30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
23b40 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
23b50 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
23b60 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
23b70 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
23b80 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
23b90 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
23ba0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
23bb0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
23bc0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
23bd0 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
23be0 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
23bf0 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
23c00 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
23c10 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
23c20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
23c30 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
23c40 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
23c50 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
23c60 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
23c70 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
23c80 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
23c90 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41   p->pKeyInfo->nA
23ca0 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20  llField<=13 ){. 
23cb0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
23cc0 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b  ->aMem[0].flags;
23cd0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79  .    if( p->pKey
23ce0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
23cf0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  [0] ){.      p->
23d00 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d  r1 = 1;.      p-
23d10 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  >r2 = -1;.    }e
23d20 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  lse{.      p->r1
23d30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
23d40 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  r2 = 1;.    }.  
23d50 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
23d60 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20  EM_Int) ){.     
23d70 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
23d80 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20  rdCompareInt;.  
23d90 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
23da0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ( flags & MEM_Re
23db0 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
23dc0 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
23dd0 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Null );.    test
23de0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
23df0 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66  M_Blob );.    if
23e00 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  ( (flags & (MEM_
23e10 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  Real|MEM_Null|ME
23e20 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70  M_Blob))==0 && p
23e30 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ->pKeyInfo->aCol
23e40 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  l[0]==0 ){.     
23e50 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
23e60 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
23e70 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
23e80 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
23e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
23ea0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
23eb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
23ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
23ed0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
23ee0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
23ef0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
23f00 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
23f10 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
23f20 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
23f30 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
23f40 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
23f50 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
23f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
23f70 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
23f80 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
23f90 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
23fa0 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
23fb0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
23fc0 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
23fd0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
23fe0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
23ff0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
24000 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
24010 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
24020 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
24030 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
24040 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
24050 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
24060 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
24070 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
24080 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
24090 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
240a0 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
240b0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
240c0 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
240d0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
240e0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
240f0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
24100 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
24110 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
24120 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
24130 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
24140 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
24150 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
24160 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
24170 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
24180 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
24190 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
241a0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
241b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
241c0 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
241d0 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
241e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
241f0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
24200 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
24210 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
24220 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
24230 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
24240 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
24250 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
24260 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
24270 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
24280 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
24290 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
242a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  ;.  assert( (nCe
242b0 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
242c0 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
242d0 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
242e0 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
242f0 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
24300 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
24310 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
24320 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
24330 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
24340 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
24350 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
24360 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
24370 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24390 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
243a0 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
243b0 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
243c0 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
243d0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
243e0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
243f0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
24400 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24410 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
24420 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3e  testcase( szHdr>
24430 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20  0x7fffffff );.  
24440 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20 29  assert( m.n>=0 )
24450 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
24460 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48 64  (szHdr<3 || szHd
24470 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e 29  r>(unsigned)m.n)
24480 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
24490 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
244a0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
244b0 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
244c0 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
244d0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
244e0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
244f0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
24500 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
24510 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
24520 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
24530 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
24540 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
24550 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
24560 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
24570 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24580 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
24590 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
245a0 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
245b0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
245c0 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
245d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
245e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
245f0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
24600 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
24610 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
24620 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
24630 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
24640 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
24650 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
24660 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
24670 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
24680 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
24690 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
246a0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
246b0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
246c0 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
246d0 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
246e0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
246f0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
24700 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
24710 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
24720 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
24730 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
24740 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
24750 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
24760 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
24770 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
24780 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
24790 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
247a0 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
247b0 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
247c0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
247d0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
247e0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
247f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
24800 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
24810 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
24820 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
24830 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
24840 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
24850 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
24860 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
24870 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
24880 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
24890 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
248a0 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
248b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
248c0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
248d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
248e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
248f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
24900 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
24910 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
24920 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
24930 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
24940 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
24950 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
24960 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
24970 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
24980 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
24990 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
249a0 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
249b0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
249c0 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
249d0 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
249e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
249f0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
24a00 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
24a10 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
24a20 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
24a30 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
24a40 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
24a50 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
24a60 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
24a70 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
24a80 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
24a90 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
24aa0 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
24ab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
24ac0 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
24ad0 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
24ae0 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
24af0 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
24b00 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
24b10 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
24b20 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
24b30 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
24b40 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
24b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
24b60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24b70 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
24b80 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
24b90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
24ba0 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
24bb0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
24bc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
24bd0 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
24be0 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
24bf0 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
24c00 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
24c30 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
24c40 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
24c50 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
24c60 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
24c70 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
24c80 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
24c90 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
24ca0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
24cb0 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
24cc0 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
24cd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24ce0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
24cf0 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20  );.  nCellKey = 
24d00 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
24d10 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
24d20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
24d30 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
24d40 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
24d50 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
24d60 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
24d70 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
24d80 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
24d90 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
24da0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
24db0 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
24dc0 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
24dd0 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
24de0 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
24df0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24e00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
24e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
24e20 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
24e30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
24e40 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
24e50 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
24e60 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69  ellKey, &m);.  i
24e70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
24e80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
24e90 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
24ea0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
24eb0 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  hSkip(m.n, m.z, 
24ec0 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
24ed0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
24ee0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
24ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24f00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
24f10 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
24f20 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
24f30 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
24f40 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
24f50 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
24f60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24f70 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
24f80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
24f90 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
24fa0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
24fb0 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
24fc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24fd0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
24fe0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
24ff0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
25000 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
25010 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
25020 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
25030 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
25040 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
25050 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
25060 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
25070 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
25080 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
25090 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
250a0 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
250b0 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
250c0 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
250d0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
250e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
250f0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
25100 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
25110 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
25120 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
25130 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
25140 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
25150 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
25160 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
25170 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
25180 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
25190 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
251a0 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
251b0 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
251c0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
251d0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
251e0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
251f0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
25200 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
25210 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
25220 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
25230 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
25240 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
25250 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a  s obsolete..**.*
25260 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c  * If iCode is 1,
25270 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e   then expiration
25280 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
25290 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f  he statement sho
252a0 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70  uld.** be reprep
252b0 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
252c0 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74  g restarted, but
252d0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
252e0 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20  y running.** it 
252f0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75  is allowed to ru
25300 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  n to completion.
25310 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c  .**.** Internall
25320 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
25330 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56   just sets the V
25340 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67  dbe.expired flag
25350 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61   on all.** prepa
25360 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  red statements. 
25370 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
25380 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d   to 1 for an imm
25390 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f  ediate expiratio
253a0 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20  n.** and set to 
253b0 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72  2 for an advisor
253c0 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f  y expiration..*/
253d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
253e0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
253f0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
25400 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20  b, int iCode){. 
25410 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
25420 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
25430 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
25440 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
25450 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a  iCode+1;.  }.}..
25460 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25470 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
25480 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
25490 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
254a0 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
254b0 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
254c0 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
254d0 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
254e0 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
254f0 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
25500 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
25510 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
25520 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
25530 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
25540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
25550 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
25560 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
25570 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
25580 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
25590 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
255a0 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
255b0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
255c0 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
255d0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
255e0 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
255f0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
25600 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
25610 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
25620 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
25630 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
25640 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
25650 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
25660 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
25670 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
25680 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
25690 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
256a0 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
256b0 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
256c0 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
256d0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
256e0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
256f0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
25700 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
25710 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
25720 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
25730 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
25740 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
25750 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
25760 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
25770 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
25780 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
25790 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
257a0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
257b0 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
257c0 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
257d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
257e0 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
257f0 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
25800 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
25810 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
25820 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
25830 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
25840 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
25850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25860 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25870 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
25880 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
25890 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
258a0 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
258b0 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
258c0 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
258d0 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
258e0 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
258f0 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
25900 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
25910 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
25920 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
25930 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
25940 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
25950 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
25960 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
25970 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25980 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
25990 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
259a0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
259b0 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
259c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
259d0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
259e0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
259f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
25a00 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
25a10 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
25a20 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
25a30 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
25a40 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
25a50 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
25a60 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
25a70 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
25a80 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
25a90 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
25aa0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
25ab0 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
25ac0 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
25ad0 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
25ae0 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
25af0 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
25b00 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
25b10 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
25b20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
25b30 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
25b40 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
25b50 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
25b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
25b70 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
25b80 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
25b90 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
25ba0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
25bb0 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78  STAT4.  if( pCtx
25bc0 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74  ->pVdbe==0 ) ret
25bd0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 1;.#endif.  
25be0 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d  if( pCtx->pVdbe-
25bf0 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e  >aOp[pCtx->iOp].
25c00 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46  opcode==OP_PureF
25c10 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
25c20 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
25c30 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e  pCtx, .       "n
25c40 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
25c50 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64   function in ind
25c60 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  ex expression or
25c70 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
25c80 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a  t",.       -1);.
25c90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
25ca0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
25cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25cc0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
25cd0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
25ce0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
25cf0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
25d00 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
25d10 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
25d20 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
25d30 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
25d40 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
25d50 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
25d60 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
25d70 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
25d80 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
25d90 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
25da0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
25db0 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
25dc0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
25dd0 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
25de0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
25df0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
25e00 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
25e10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
25e20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
25e30 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
25e40 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
25e50 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
25e60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25e70 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
25e80 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
25e90 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
25ea0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25eb0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
25ec0 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
25ed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
25ee0 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
25ef0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
25f00 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
25f10 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
25f20 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
25f30 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
25f40 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
25f50 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
25f60 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
25f70 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
25f80 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
25f90 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
25fa0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
25fb0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
25fc0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
25fd0 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
25fe0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
25ff0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
26000 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
26010 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
26020 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
26030 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
26040 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
26050 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
26060 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
26070 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
26080 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
26090 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
260a0 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
260b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
260c0 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
260d0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
260e0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
260f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
26100 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
26110 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
26120 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
26130 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
26140 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
26150 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
26160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26170 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
26180 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
26190 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
261a0 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
261b0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
261c0 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
261d0 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
261e0 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
261f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
26200 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
26210 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
26220 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
26230 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
26240 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
26250 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
26260 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
26270 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
26280 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
26290 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
262a0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
262b0 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
262c0 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
262d0 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
26300 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
26310 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
26320 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
26330 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
26340 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
26350 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
26360 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
26370 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
26380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26390 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
263a0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
263b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
263c0 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
263d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
263e0 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
263f0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
26400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
26410 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
26420 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
26450 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
26460 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
26470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26480 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
26490 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
264a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
264b0 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
264c0 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
264d0 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
264e0 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
264f0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
26500 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
26510 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
26520 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
26530 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
26540 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
26550 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
26560 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
26570 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
26580 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
26590 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
265a0 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
265b0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
265c0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
265d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
265e0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
265f0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
26600 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
26610 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
26620 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
26630 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
26640 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
26650 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
26660 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
26670 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
26680 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
26690 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
266a0 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
266b0 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
266c0 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
266d0 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
266e0 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
266f0 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
26700 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
26710 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
26720 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
26730 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
26740 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
26750 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
26760 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d  info.nKeyField =
26770 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70   pTab->nCol;.  p
26780 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
26790 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  .aSortOrder = (u
267a0 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65  8*)&fakeSortOrde
267b0 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  r;.  preupdate.i
267c0 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key1 = iKey1;.  
267d0 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20  preupdate.iKey2 
267e0 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70  = iKey2;.  preup
267f0 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62  date.pTab = pTab
26800 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  ;..  db->pPreUpd
26810 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65  ate = &preupdate
26820 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
26830 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
26840 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62  PreUpdateArg, db
26850 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
26860 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a   iKey1, iKey2);.
26870 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
26880 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
26890 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
268a0 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20  ate.aRecord);.  
268b0 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
268c0 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b  (db, preupdate.k
268d0 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64  eyinfo.nKeyField
268e0 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  +1, preupdate.pU
268f0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
26900 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
26910 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26920 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
26930 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
26940 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
26950 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
26960 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26970 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
26980 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
26990 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
269a0 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
269b0 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
269c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
269d0 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72  3DbFreeNN(db, pr
269e0 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
269f0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
26a00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
26a10 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.