/ Hex Artifact Content
Login

Artifact 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582:


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: 43 72 65 61 74 65 49 6e 64 65 78 20 3d 20 30 3b  CreateIndex = 0;
48f0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f  .  int hasInitCo
4900: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f  routine = 0;.  O
4910: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
4920: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
4930: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
4940: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
4950: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
4960: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
4970: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
4980: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
4990: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
49a0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
49b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
49c0: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
49d0: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
49e0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
49f0: 20 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d       || opcode==
4a00: 4f 50 5f 56 44 65 73 74 72 6f 79 0a 20 20 20 20  OP_VDestroy.    
4a10: 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f   || (opcode==OP_
4a20: 46 75 6e 63 74 69 6f 6e 30 20 26 26 20 70 4f 70  Function0 && pOp
4a30: 2d 3e 70 34 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  ->p4.pFunc->func
4a40: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
4a50: 43 5f 49 4e 54 45 52 4e 41 4c 29 0a 20 20 20 20  C_INTERNAL).    
4a60: 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50   || ((opcode==OP
4a70: 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Halt || opcode=
4a80: 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20  =OP_HaltIfNull) 
4a90: 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d  .      && ((pOp-
4aa0: 3e 70 31 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  >p1)!=SQLITE_OK 
4ab0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
4ac0: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20  bort)).    ){.  
4ad0: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31      hasAbort = 1
4ae0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4af0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
4b00: 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74  ode==OP_CreateBt
4b10: 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ree && pOp->p3==
4b20: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68  BTREE_INTKEY ) h
4b30: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
4b40: 31 3b 0a 20 20 20 20 69 66 28 20 6d 61 79 41 62  1;.    if( mayAb
4b50: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ort ){.      /* 
4b60: 68 61 73 43 72 65 61 74 65 49 6e 64 65 78 20 6d  hasCreateIndex m
4b70: 61 79 20 61 6c 73 6f 20 62 65 20 73 65 74 20 66  ay also be set f
4b80: 6f 72 20 73 6f 6d 65 20 44 45 4c 45 54 45 20 73  or some DELETE s
4b90: 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
4ba0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  se.      ** OP_C
4bb0: 6c 65 61 72 2e 20 53 6f 20 74 68 69 73 20 72 6f  lear. So this ro
4bc0: 75 74 69 6e 65 20 6d 61 79 20 65 6e 64 20 75 70  utine may end up
4bd0: 20 72 65 74 75 72 6e 69 6e 67 20 74 72 75 65 20   returning true 
4be0: 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
4bf0: 20 20 20 2a 2a 20 77 68 65 72 65 20 61 20 22 44     ** where a "D
4c00: 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 22 20  ELETE FROM tbl" 
4c10: 68 61 73 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  has a statement-
4c20: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 64 6f 65 73  journal but does
4c30: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
4c40: 71 75 69 72 65 20 6f 6e 65 2e 20 54 68 69 73 20  quire one. This 
4c50: 69 73 20 6e 6f 74 20 73 6f 20 62 61 64 20 2d 20  is not so bad - 
4c60: 69 74 20 69 73 20 61 6e 20 69 6e 65 66 66 69 63  it is an ineffic
4c70: 69 65 6e 63 79 2c 20 6e 6f 74 20 61 20 62 75 67  iency, not a bug
4c80: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f  . */.      if( o
4c90: 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
4ca0: 42 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33  Btree && pOp->p3
4cb0: 3d 3d 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20  ==BTREE_BLOBKEY 
4cc0: 29 20 68 61 73 43 72 65 61 74 65 49 6e 64 65 78  ) hasCreateIndex
4cd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
4ce0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6c 65 61 72  opcode==OP_Clear
4cf0: 20 29 20 68 61 73 43 72 65 61 74 65 49 6e 64 65   ) hasCreateInde
4d00: 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  x = 1;.    }.   
4d10: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4d20: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
4d30: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
4d40: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
4d50: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
4d60: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
4d70: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
4d80: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
4d90: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
4da0: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
4db0: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
4dc0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
4dd0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
4de0: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
4df0: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
4e00: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
4e10: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
4e20: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
4e30: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
4e40: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
4e50: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
4e60: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
4e70: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
4e80: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
4e90: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
4ea0: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
4eb0: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
4ec0: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
4ed0: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
4ee0: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
4ef0: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
4f00: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
4f10: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
4f20: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
4f30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4f40: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
4f50: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
4f60: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
4f70: 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61   || (hasCreateTa
4f80: 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f  ble && hasInitCo
4f90: 72 6f 75 74 69 6e 65 29 20 7c 7c 20 68 61 73 43  routine) || hasC
4fa0: 72 65 61 74 65 49 6e 64 65 78 0a 20 20 29 3b 0a  reateIndex.  );.
4fb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4fc0: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
4fd0: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
4fe0: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
4ff0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
5000: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e  E_DEBUG./*.** In
5010: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69  crement the nWri
5020: 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68  te counter in th
5030: 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75  e VDBE if the cu
5040: 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a  rsor is not an.*
5050: 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  * ephemeral curs
5060: 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75  or, or if the cu
5070: 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73  rsor argument is
5080: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
5090: 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
50a0: 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20  iteCounter(Vdbe 
50b0: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
50c0: 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30  pC){.  if( pC==0
50d0: 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72  .   || (pC->eCur
50e0: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f  Type!=CURTYPE_SO
50f0: 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70  RTER.       && p
5100: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
5110: 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20  TYPE_PSEUDO.    
5120: 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68     && !pC->isEph
5130: 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20  emeral).  ){.   
5140: 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20   p->nWrite++;.  
5150: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
5160: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5170: 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20  /*.** Assert if 
5180: 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73  an Abort at this
5190: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d   point in time m
51a0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
51b0: 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61   corrupt.** data
51c0: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
51d0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
51e0: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
51f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5200: 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e  nWrite==0 || p->
5210: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
5220: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5240: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
5250: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
5260: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
5270: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
5280: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
5290: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
52a0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
52b0: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
52c0: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
52d0: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
52e0: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
52f0: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
5300: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
5310: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
5320: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
5330: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
5340: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
5350: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
5360: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
5370: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
5380: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
5390: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
53a0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
53b0: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
53c0: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
53d0: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
53e0: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
53f0: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
5400: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5410: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
5420: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
5430: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
5440: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
5450: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
5460: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
5470: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
5480: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
5490: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
54a0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
54b0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
54c0: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
54d0: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
54e0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
54f0: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
5500: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
5510: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
5520: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
5530: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
5540: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
5550: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
5560: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
5570: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
5580: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
5590: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
55a0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
55b0: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
55c0: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
55d0: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
55e0: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
55f0: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
5600: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
5610: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
5620: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
5630: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
5640: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
5650: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
5660: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
5670: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
5680: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
5690: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
56a0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
56b0: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
56c0: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
56d0: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
56e0: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
56f0: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
5700: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
5710: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
5720: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
5730: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
5740: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
5750: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
5760: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
5770: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
5780: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
5790: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
57a0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
57b0: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
57c0: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
57d0: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
57e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
57f0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
5800: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
5810: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
5820: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
5830: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
5840: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
5850: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
5860: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
5870: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
5880: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
5890: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
58a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
58b0: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
58c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
58d0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
58e0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
58f0: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
5900: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
5910: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
5920: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
5930: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
5940: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
5950: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
5960: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
5970: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
5980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5990: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
59a0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
59b0: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
59c0: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
59d0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
59e0: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
59f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
5a00: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
5a10: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
5a20: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
5a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5a40: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
5a50: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
5a60: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
5a70: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
5a80: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
5a90: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
5aa0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
5ab0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5ac0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5ad0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5ae0: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5af0: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5b00: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5b10: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5b20: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5b30: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5b40: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
5b50: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
5b60: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
5b70: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
5b80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5b90: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
5ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5bc0: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a  case OP_Prev: {.
5bd0: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5be0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
5bf0: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
5c00: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
5c10: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
5c20: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
5c30: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
5c40: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
5c50: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
5c60: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
5c70: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
5c80: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
5c90: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
5ca0: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
5cb0: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
5cc0: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
5cd0: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
5ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5cf0: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
5d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5d10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
5d20: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5d30: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
5d40: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
5d50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5d60: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
5d70: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
5d80: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
5d90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5da0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5db0: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
5dc0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
5dd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5de0: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
5df0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
5e00: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
5e10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
5e20: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
5e30: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
5e40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
5e50: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5e60: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
5e70: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5e80: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
5e90: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
5ea0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5eb0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5ec0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
5ed0: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
5ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
5ef0: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
5f00: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
5f10: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
5f20: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
5f30: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
5f40: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
5f50: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5f60: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5f70: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
5f80: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5f90: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5fa0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5fb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5fc0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5fd0: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5fe0: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
5ff0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
6000: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
6010: 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65  pOp->p2)<-pParse
6020: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
6030: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
6040: 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f  = aLabel[ADDR(pO
6050: 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20  p->p2)];.       
6060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
6070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6090: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
60a0: 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f  cl script has so
60b0: 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73   arranged things
60c0: 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20   that the only. 
60d0: 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70       ** non-jump
60e0: 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68   opcodes less th
60f0: 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  an SQLITE_MX_JUM
6100: 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61  P_CODE are guara
6110: 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  nteed to.      *
6120: 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74  * have non-negat
6130: 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50  ive values for P
6140: 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  2. */.      asse
6150: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
6160: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
6170: 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55  opcode]&OPFLG_JU
6180: 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  MP)==0 || pOp->p
6190: 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2>=0);.    }.   
61a0: 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70   if( pOp==p->aOp
61b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f   ) break;.    pO
61c0: 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p--;.  }.  sqlit
61d0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
61e0: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
61f0: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
6200: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
6210: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
6220: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
6230: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
6240: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
6250: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
6260: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
6270: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
6280: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
6290: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
62a0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
62b0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
62c0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
62d0: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
62e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
62f0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6300: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
6310: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
6320: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74  * Verify that at
6330: 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20   least N opcode 
6340: 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
6350: 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74  ble in p without
6360: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61  .** having to ma
6370: 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70  lloc for more sp
6380: 61 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e  ace (except when
6390: 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a   compiled using.
63a0: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ** SQLITE_TEST_R
63b0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20  EALLOC_STRESS). 
63c0: 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   This interface 
63d0: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
63e0: 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72  esting.** to ver
63f0: 69 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e  ify that certain
6400: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
6420: 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61   can never.** fa
6430: 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20  il due to a OOM 
6440: 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20  fault and hence 
6450: 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20  that the return 
6460: 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71  value from.** sq
6470: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
6480: 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73  st() will always
6490: 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f   be non-NULL..*/
64a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
64b0: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
64c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
64d0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
64e0: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
64f0: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
6500: 63 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a  cRequired(Vdbe *
6510: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
6520: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20  ert( p->nOp + N 
6530: 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  <= p->nOpAlloc )
6540: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
6550: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
6560: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
6570: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
6580: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
6590: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
65a0: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
65b0: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
65c0: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
65d0: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
65e0: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
65f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6600: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6610: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
6620: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
6630: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
6640: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
6650: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
6660: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
6670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6680: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
6690: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
66a0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
66b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
66c0: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
66d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
66e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
66f0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
6700: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6710: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
6720: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
6730: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
6750: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
6760: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
6770: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
6780: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
6790: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
67a0: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
67b0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
67c0: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
67d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
67e0: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
67f0: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
6800: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
6810: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
6820: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
6830: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
6840: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
6850: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
6860: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
6870: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6880: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6890: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
68a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
68b0: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
68c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
68d0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
68e0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
68f0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
6900: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
6910: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
6920: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
6930: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
6940: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
6950: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
6960: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
6970: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
6980: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
6990: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
69a0: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
69b0: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
69c0: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
69d0: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
69e0: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
69f0: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
6a00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
6a10: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
6a20: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
6a30: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
6a40: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
6a50: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
6a60: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
6a70: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
6a80: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
6a90: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
6aa0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
6ab0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
6ac0: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
6ad0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6ae0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
6af0: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
6b00: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
6b10: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
6b20: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
6b30: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
6b40: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
6b50: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
6b60: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
6b70: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
6b80: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
6b90: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
6ba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
6bb0: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
6bc0: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
6bd0: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
6be0: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
6bf0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
6c00: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
6c10: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
6c20: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
6c30: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6c40: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
6c50: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
6c60: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
6c70: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
6c80: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
6c90: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
6ca0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6cb0: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6cc0: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6cd0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6cf0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
6d00: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
6d10: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d40: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6d50: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6d60: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6d70: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6d80: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6d90: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6dc0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6dd0: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
6de0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
6df0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
6e00: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
6e10: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6e20: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6e30: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6e40: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6e50: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
6e60: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20   growOpArray(p, 
6e70: 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nOp) ){.    retu
6e80: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72  rn 0;.  }.  pFir
6e90: 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e  st = pOut = &p->
6ea0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66  aOp[p->nOp];.  f
6eb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
6ec0: 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b  ++, aOp++, pOut+
6ed0: 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70  +){.    pOut->op
6ee0: 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f  code = aOp->opco
6ef0: 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31  de;.    pOut->p1
6f00: 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = aOp->p1;.    
6f10: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e  pOut->p2 = aOp->
6f20: 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p2;.    assert( 
6f30: 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  aOp->p2>=0 );.  
6f40: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70    if( (sqlite3Op
6f50: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70  codeProperty[aOp
6f60: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
6f70: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f  G_JUMP)!=0 && aO
6f80: 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
6f90: 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e   pOut->p2 += p->
6fa0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nOp;.    }.    p
6fb0: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
6fc0: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
6fd0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
6fe0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
6ff0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
7000: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
7010: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7020: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
7030: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
7040: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
7050: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
7060: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
7070: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
7080: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
7090: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
70a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
70b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
70c0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
70d0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
70e0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
70f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
7100: 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f  intOp(0, i+p->nO
7110: 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e  p, &p->aOp[i+p->
7120: 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  nOp]);.    }.#en
7130: 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  dif.  }.  p->nOp
7140: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72   += nOp;.  retur
7150: 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66  n pFirst;.}..#if
7160: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7170: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
7180: 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64  STATUS)./*.** Ad
7190: 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
71a0: 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74  e array of count
71b0: 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ers managed by s
71c0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
71d0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69  status()..*/.voi
71e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61  d sqlite3VdbeSca
71f0: 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20  nStatus(.  Vdbe 
7200: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d             /* VM
7220: 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74   to add scanstat
7230: 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  us() to */.  int
7240: 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20   addrExplain,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7260: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78  Address of OP_Ex
7270: 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a  plain (or 0) */.
7280: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20    int addrLoop, 
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
72b0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20  loop counter */ 
72c0: 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74  .  int addrVisit
72d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
72e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
72f0: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f   rows visited co
7300: 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73  unter */.  LogEs
7310: 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20  t nEst,         
7320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
7330: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
7340: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
7350: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7360: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
7370: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
7380: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69  ble or index bei
7390: 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b  ng scanned */.){
73a0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
73b0: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
73c0: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
73d0: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
73e0: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
73f0: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
7400: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
7410: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
7420: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
7430: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
7440: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
7450: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
7460: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
7470: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
7480: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
7490: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
74a0: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
74b0: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
74c0: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
74d0: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
74e0: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
74f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7500: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
7510: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
7520: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
7530: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
7540: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
7550: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
7560: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
7570: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
7580: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
7590: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
75a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
75b0: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
75c0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75   *p, u32 addr, u
75d0: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
75e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
75f0: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
7600: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
7610: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7620: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
7630: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
7640: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
7650: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
7660: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
7670: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7680: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
7690: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
76a0: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
76b0: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
76c0: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
76d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
76e0: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
76f0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
7700: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
7710: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
7720: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
7730: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7740: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31  geP5(Vdbe *p, u1
7750: 36 20 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28  6 p5){.  assert(
7760: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
7770: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7780: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
7790: 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >0 ) p->aOp[p->n
77a0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d  Op-1].p5 = p5;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
77c0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
77d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
77e0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
77f0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
7800: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
7810: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
7820: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
7830: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
7840: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
7850: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
7860: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
7870: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
7880: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
7890: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
78a0: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
78b0: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
78c0: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
78d0: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
78e0: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
78f0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
7900: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
7910: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
7920: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  n(sqlite3 *db, F
7930: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
7940: 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
7950: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
7960: 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b  UNC_EPHEM)!=0 ){
7970: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
7980: 65 65 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a  eeNN(db, pDef);.
7990: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
79a0: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
79b0: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
79c0: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
79d0: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
79e0: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
79f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
7a00: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
7a10: 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65  freeP4Mem(sqlite
7a20: 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a  3 *db, Mem *p){.
7a30: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
7a40: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
7a50: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
7a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
7a70: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  eeNN(db, p);.}.s
7a80: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
7a90: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
7aa0: 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33  4FuncCtx(sqlite3
7ab0: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f   *db, sqlite3_co
7ac0: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65  ntext *p){.  fre
7ad0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
7ae0: 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29  on(db, p->pFunc)
7af0: 3b 0a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ;. sqlite3DbFree
7b00: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
7b10: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
7b20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
7b30: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
7b40: 34 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62  4){.  assert( db
7b50: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34   );.  switch( p4
7b60: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
7b70: 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20   P4_FUNCCTX: {. 
7b80: 20 20 20 20 20 66 72 65 65 50 34 46 75 6e 63 43       freeP4FuncC
7b90: 74 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f  tx(db, (sqlite3_
7ba0: 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20  context*)p4);.  
7bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7bc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
7bd0: 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  L:.    case P4_I
7be0: 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50  NT64:.    case P
7bf0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63  4_DYNAMIC:.    c
7c00: 61 73 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a  ase P4_DYNBLOB:.
7c10: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7c20: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7c30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7c40: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7c60: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
7c70: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7c80: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
7c90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
7ca0: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
7cb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7cc0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
7cd0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
7ce0: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
7cf0: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
7d00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7d10: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
7d20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7d30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7d40: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
7d50: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70  : {.      freeEp
7d60: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7d70: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
7d80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7d90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7da0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69  4_MEM: {.      i
7db0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7dc0: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
7dd0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7de0: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
7df0: 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65  e*)p4);.      }e
7e00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65  lse{.        fre
7e10: 65 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a  eP4Mem(db, (Mem*
7e20: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )p4);.      }.  
7e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41  .    case P4_VTA
7e50: 42 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  B : {.      if( 
7e60: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
7e70: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61  ==0 ) sqlite3Vta
7e80: 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20  bUnlock((VTable 
7e90: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7eb0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
7ec0: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
7ed0: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
7ee0: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
7ef0: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
7f00: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
7f10: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
7f20: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
7f30: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
7f40: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
7f50: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
7f60: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
7f70: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
7f80: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
7f90: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
7fa0: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
7fb0: 20 20 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70      for(pOp=&aOp
7fc0: 5b 6e 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f  [nOp-1]; pOp>=aO
7fd0: 70 3b 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20  p; pOp--){.     
7fe0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
7ff0: 20 3c 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c   <= P4_FREE_IF_L
8000: 45 20 29 20 66 72 65 65 50 34 28 64 62 2c 20 70  E ) freeP4(db, p
8010: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
8020: 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53  >p4.p);.#ifdef S
8030: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
8040: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
8050: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8060: 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e(db, pOp->zComm
8070: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
8080: 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69   .    }.    sqli
8090: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
80a0: 61 4f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  aOp);.  }.}../*.
80b0: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
80c0: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
80d0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
80e0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
80f0: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
8100: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
8110: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
8120: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
8130: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
8140: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
8150: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
8160: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
8170: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
8180: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
8190: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
81a0: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
81b0: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
81c0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
81d0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
81e0: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
81f0: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
8200: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
8210: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71  P_Noop.*/.int sq
8220: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
8230: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
8240: 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65  nt addr){.  Vdbe
8250: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
8260: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8270: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
8280: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
8290: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20   && addr<p->nOp 
82a0: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  );.  pOp = &p->a
82b0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
82c0: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
82d0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
82e0: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  );.  pOp->p4type
82f0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
8300: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a   pOp->p4.z = 0;.
8310: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
8320: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72  OP_Noop;.  retur
8330: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 1;.}../*.** If
8340: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
8350: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
8360: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
8370: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
8380: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
8390: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
83a0: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
83b0: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
83c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
83d0: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
83e0: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
83f0: 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e   op){.  if( p->n
8400: 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70  Op>0 && p->aOp[p
8410: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
8420: 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =op ){.    retur
8430: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  n sqlite3VdbeCha
8440: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e  ngeToNoop(p, p->
8450: 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  nOp-1);.  }else{
8460: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8480: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
8490: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
84a0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
84b0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
84c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
84d0: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
84e0: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
84f0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
8500: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8520: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
8530: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
8540: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
8550: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
8560: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
8570: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
8580: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
8590: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
85a0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
85b0: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
85c0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
85d0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
85e0: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
85f0: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
8600: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
8610: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
8620: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
8630: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
8640: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
8650: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
8660: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
8670: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
8680: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
8690: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
86a0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
86b0: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
86c0: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
86d0: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
86e0: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
86f0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
8700: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
8710: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
8720: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
8730: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
8740: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
8750: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
8760: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
8770: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
8780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8790: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
87a0: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
87b0: 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20  l(.  Vdbe *p,.  
87c0: 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74  Op *pOp,.  const
87d0: 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e   char *zP4,.  in
87e0: 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70  t n.){.  if( pOp
87f0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8800: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
8810: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
8820: 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  p4.p);.    pOp->
8830: 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  p4type = 0;.    
8840: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
8850: 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a   }.  if( n<0 ){.
8860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8870: 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29  hangeP4(p, (int)
8880: 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20  (pOp - p->aOp), 
8890: 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  zP4, n);.  }else
88a0: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
88b0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
88c0: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
88d0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
88e0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
88f0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
8900: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
8910: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
8920: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8930: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
8940: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
8950: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
8960: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
8970: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8980: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
8990: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
89a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
89b0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
89c0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
89d0: 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d  p->aOp!=0 || db-
89e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
89f0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
8a00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
8a10: 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  f( n!=P4_VTAB ) 
8a20: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
8a30: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
8a40: 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  P4);.    return;
8a50: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8a60: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
8a70: 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  ert( addr<p->nOp
8a80: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
8a90: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
8aa0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
8ab0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
8ac0: 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30  ddr];.  if( n>=0
8ad0: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20   || pOp->p4type 
8ae0: 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67  ){.    vdbeChang
8af0: 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20  eP4Full(p, pOp, 
8b00: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74  zP4, n);.    ret
8b10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
8b20: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
8b30: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
8b40: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
8b50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
8b60: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
8b70: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
8b80: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
8b90: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
8ba0: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
8bb0: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
8bc0: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
8bd0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
8be0: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
8bf0: 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20  if( zP4!=0 ){.  
8c00: 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b    assert( n<0 );
8c10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
8c20: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
8c30: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
8c40: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
8c50: 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41     if( n==P4_VTA
8c60: 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c  B ) sqlite3VtabL
8c70: 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34  ock((VTable*)zP4
8c80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8c90: 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70  Change the P4 op
8ca0: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73  erand of the mos
8cb0: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
8cc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a   instruction .**
8cd0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65   to the value de
8ce0: 66 69 6e 65 64 20 62 79 20 74 68 65 20 61 72 67  fined by the arg
8cf0: 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73  uments.  This is
8d00: 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a   a high-speed.**
8d10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
8d20: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
8d30: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  )..**.** The P4 
8d40: 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74  operand must not
8d50: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
8d60: 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20  ously defined.  
8d70: 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50  And the new.** P
8d80: 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34  4 must not be P4
8d90: 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c  _INT32.  Use sql
8da0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
8db0: 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a  () in either of.
8dc0: 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a  ** those cases..
8dd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8de0: 64 62 65 41 70 70 65 6e 64 50 34 28 56 64 62 65  dbeAppendP4(Vdbe
8df0: 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20   *p, void *pP4, 
8e00: 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70  int n){.  VdbeOp
8e10: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28   *pOp;.  assert(
8e20: 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20   n!=P4_INT32 && 
8e30: 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20  n!=P4_VTAB );.  
8e40: 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a  assert( n<=0 );.
8e50: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
8e60: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8e70: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e   freeP4(p->db, n
8e80: 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  , pP4);.  }else{
8e90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 34  .    assert( pP4
8ea0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
8eb0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
8ec0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
8ed0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20  [p->nOp-1];.    
8ee0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
8ef0: 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20  ype==P4_NOTUSED 
8f00: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
8f10: 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d  pe = n;.    pOp-
8f20: 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d  >p4.p = pP4;.  }
8f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8f40: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
8f50: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8f60: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
8f70: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
8f80: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
8f90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8fa0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
8fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
8fc0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
8fd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8fe0: 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Vdbe;.  KeyInfo 
8ff0: 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73  *pKeyInfo;.  ass
9000: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
9010: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
9020: 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73  ;.  pKeyInfo = s
9030: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
9040: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64  ndex(pParse, pId
9050: 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  x);.  if( pKeyIn
9060: 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  fo ) sqlite3Vdbe
9070: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79  AppendP4(v, pKey
9080: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
9090: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
90a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
90b0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a  IN_COMMENTS./*.*
90c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
90d0: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  ment on the most
90e0: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
90f0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
9100: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
9110: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
9120: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
9130: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
9140: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
9150: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
9160: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
9170: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
9180: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
9190: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
91a0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
91b0: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
91c0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
91d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
91e0: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
91f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
9200: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
9210: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9220: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
9230: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
9240: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
9250: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9260: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
9270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9280: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
9290: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
92a0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
92b0: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
92c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
92d0: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
92e0: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
92f0: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
9300: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
9310: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
9320: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
9330: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
9340: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
9350: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
9360: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
9370: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
9380: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
9390: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
93a0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
93b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
93c0: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
93d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
93e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
93f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
9400: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
9410: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
9420: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
9430: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
9440: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
9450: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
9460: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
9470: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
9480: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
9490: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
94a0: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
94b0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
94c0: 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c  lue if the iSrcL
94d0: 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ine field for th
94e0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64  e previously cod
94f0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
9500: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9510: 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72  dbeSetLineNumber
9520: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c  (Vdbe *v, int iL
9530: 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ine){.  sqlite3V
9540: 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e  dbeGetOp(v,-1)->
9550: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
9560: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9570: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
9580: 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  GE */../*.** Ret
9590: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
95a0: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
95b0: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
95c0: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
95d0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
95e0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
95f0: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
9600: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9610: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9620: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
9630: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
9640: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
9650: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
9660: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
9670: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
9680: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
9690: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
96a0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
96b0: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
96c0: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
96d0: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
96e0: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
96f0: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
9700: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
9710: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
9720: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
9730: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  n OOM fault with
9740: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68  out having to ch
9750: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
9760: 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a  e return from .*
9770: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
9780: 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  s a valid pointe
9790: 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  r.  But because 
97a0: 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65  the dummy.opcode
97b0: 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20   is 0,.** dummy 
97c0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72  will never be wr
97d0: 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20  itten to.  This 
97e0: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63  is verified by c
97f0: 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61  ode inspection a
9800: 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67  nd.** by running
9810: 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a   with Valgrind..
9820: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
9830: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
9840: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
9850: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
9860: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
9870: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
9880: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
9890: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
98a0: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
98b0: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
98c0: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
98d0: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
98e0: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
98f0: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
9900: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
9910: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
9920: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
9930: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9940: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
9950: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
9960: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
9970: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
9980: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
9990: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
99a0: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
99b0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
99c0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
99d0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
99e0: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
99f0: 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mmy;.  }else{.  
9a00: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70    return &p->aOp
9a10: 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23  [addr];.  }.}..#
9a20: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
9a30: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
9a40: 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a  _COMMENTS)./*.**
9a50: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
9a60: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65  er value for one
9a70: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
9a80: 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65  rs to the opcode
9a90: 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   pOp.** determin
9aa0: 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20  ed by character 
9ab0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
9ac0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72   translateP(char
9ad0: 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f   c, const Op *pO
9ae0: 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27  p){.  if( c=='1'
9af0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
9b00: 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20  1;.  if( c=='2' 
9b10: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32  ) return pOp->p2
9b20: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29  ;.  if( c=='3' )
9b30: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b   return pOp->p3;
9b40: 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20  .  if( c=='4' ) 
9b50: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69  return pOp->p4.i
9b60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
9b70: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p5;.}../*.** Com
9b80: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f  pute a string fo
9b90: 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20  r the "comment" 
9ba0: 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20  field of a VDBE 
9bb0: 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a  opcode listing..
9bc0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73  **.** The Synops
9bd0: 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d  is: field in com
9be0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62  ments in the vdb
9bf0: 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20  e.c source file 
9c00: 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a  gets converted.*
9c10: 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74  * to an extra st
9c20: 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70  ring that is app
9c30: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  ended to the sql
9c40: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
9c50: 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73  .  In the.** abs
9c60: 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f  ence of other co
9c70: 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e  mments, this syn
9c80: 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68  opsis becomes th
9c90: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
9ca0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65   opcode..** Some
9cb0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63   translation occ
9cc0: 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  urs:.**.**      
9cd0: 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22   "PX"      ->  "
9ce0: 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22  r[X]".**       "
9cf0: 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b  PX@PY"   ->  "r[
9d00: 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22  X..X+Y-1]"  or "
9d10: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20  r[x]" if y is 0 
9d20: 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50  or 1.**       "P
9d30: 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58  X@PY+1" ->  "r[X
9d40: 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72  ..X+Y]"    or "r
9d50: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a  [x]" if y is 0.*
9d60: 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22  *       "PY..PY"
9d70: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20    ->  "r[X..Y]" 
9d80: 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69       or "r[x]" i
9d90: 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63  f y<=x.*/.static
9da0: 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d   int displayComm
9db0: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20  ent(.  const Op 
9dc0: 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pOp,     /* The
9dd0: 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f   opcode to be co
9de0: 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e  mmented */.  con
9df0: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20  st char *zP4,   
9e00: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62  /* Previously ob
9e10: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72  tained value for
9e20: 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   P4 */.  char *z
9e30: 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57  Temp,       /* W
9e40: 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65  rite result here
9e50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20   */.  int nTemp 
9e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
9e70: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a  e available in z
9e80: 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63  Temp[] */.){.  c
9e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
9ea0: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
9eb0: 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69   *zSynopsis;.  i
9ec0: 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e  nt nOpName;.  in
9ed0: 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72  t ii, jj;.  char
9ee0: 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70   zAlt[50];.  zOp
9ef0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70  Name = sqlite3Op
9f00: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
9f10: 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65  code);.  nOpName
9f20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9f30: 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69  30(zOpName);.  i
9f40: 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61  f( zOpName[nOpNa
9f50: 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me+1] ){.    int
9f60: 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20   seenCom = 0;.  
9f70: 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53    char c;.    zS
9f80: 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d  ynopsis = zOpNam
9f90: 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31  e += nOpName + 1
9fa0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
9fb0: 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20  p(zSynopsis,"IF 
9fc0: 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)==0 ){.     
9fd0: 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
9fe0: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b  QLITE_STOREP2 ){
9ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a000: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
a010: 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72  (zAlt), zAlt, "r
a020: 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53  [P2] = (%s)", zS
a030: 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20  ynopsis+3);.    
a040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a050: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a060: 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20  f(sizeof(zAlt), 
a070: 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74  zAlt, "if %s got
a080: 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73  o P2", zSynopsis
a090: 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +3);.      }.   
a0a0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
a0b0: 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Alt;.    }.    f
a0c0: 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e  or(ii=jj=0; jj<n
a0d0: 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a  Temp-1 && (c = z
a0e0: 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30  Synopsis[ii])!=0
a0f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
a100: 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20  f( c=='P' ){.   
a110: 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73       c = zSynops
a120: 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20  is[++ii];.      
a130: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a    if( c=='4' ){.
a140: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a150: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
a160: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
a170: 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20  %s", zP4);.     
a180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a190: 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'X' ){.         
a1a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a1b0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
a1c0: 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  p+jj, "%s", pOp-
a1d0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
a1e0: 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20        seenCom = 
a1f0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
a200: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
a210: 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v1 = translateP(
a220: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  c, pOp);.       
a230: 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20     int v2;.     
a240: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
a250: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
a260: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20  zTemp+jj, "%d", 
a270: 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  v1);.          i
a280: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a290: 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c  psis+ii+1, "@P",
a2a0: 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   2)==0 ){.      
a2b0: 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20        ii += 3;. 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d             jj +=
a2d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a2e0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
a2f0: 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61          v2 = tra
a300: 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69  nslateP(zSynopsi
a310: 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20  s[ii], pOp);.   
a320: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
a330: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
a340: 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29  i+1,"+1",2)==0 )
a350: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a360: 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ii += 2;.       
a370: 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20         v2++;.   
a380: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a390: 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20         if( v2>1 
a3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a3b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a3c0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
a3d0: 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31  p+jj, "..%d", v1
a3e0: 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  +v2-1);.        
a3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a400: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
a410: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
a420: 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20  , "..P3", 4)==0 
a430: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b  && pOp->p3==0 ){
a440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20  .            ii 
a450: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
a460: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
a470: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
a480: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
a490: 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  jj);.      }else
a4a0: 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  {.        zTemp[
a4b0: 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  jj++] = c;.     
a4c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a4d0: 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c   !seenCom && jj<
a4e0: 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e  nTemp-5 && pOp->
a4f0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
a500: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a510: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
a520: 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70  mp+jj, "; %s", p
a530: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
a540: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
a550: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a560: 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +jj);.    }.    
a570: 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a  if( jj<nTemp ) z
a580: 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20  Temp[jj] = 0;.  
a590: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a  }else if( pOp->z
a5a0: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  Comment ){.    s
a5b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a5c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
a5d0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
a5e0: 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c  t);.    jj = sql
a5f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
a600: 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mp);.  }else{.  
a610: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
a620: 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a      jj = 0;.  }.
a630: 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23    return jj;.}.#
a640: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a650: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44  DEBUG */..#if VD
a660: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26  BE_DISPLAY_P4 &&
a670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a680: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
a690: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  NTS)./*.** Trans
a6a0: 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78 70  late the P4.pExp
a6b0: 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f  r value for an O
a6c0: 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63  P_CursorHint opc
a6d0: 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a  ode into text.**
a6e0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69 73   that can be dis
a6f0: 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50 34  played in the P4
a700: 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41   column of EXPLA
a710: 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  IN output..*/.st
a720: 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
a730: 79 50 34 45 78 70 72 28 53 74 72 41 63 63 75 6d  yP4Expr(StrAccum
a740: 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72   *p, Expr *pExpr
a750: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
a760: 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74  *zOp = 0;.  swit
a770: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a780: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
a790: 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ING:.      sqlit
a7a0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a7b0: 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  , "%Q", pExpr->u
a7c0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
a7d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a7e0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
a7f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
a800: 70 65 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70  pendf(p, "%d", p
a810: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
a820: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a830: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
a840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a850: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55  r_appendf(p, "NU
a860: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  LL");.      brea
a870: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
a880: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
a890: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a8a0: 65 6e 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c  endf(p, "r[%d]",
a8b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
a8c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a8d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a8e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
a8f0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
a900: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
a910: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a920: 6e 64 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b  ndf(p, "rowid");
a930: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a950: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25  r_appendf(p, "c%
a960: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
a970: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
a980: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a990: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a9a0: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
a9b0: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
a9c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
a9d0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
a9e0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a9f0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
aa00: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
aa10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa20: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
aa30: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
aa40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aa50: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
aa60: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
aa70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa80: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
aa90: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
aaa0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
aab0: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
aac0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
aad0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
aae0: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
aaf0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
ab00: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
ab10: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
ab20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
ab30: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
ab40: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
ab50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ab60: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
ab70: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
ab80: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab90: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
aba0: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
abb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
abc0: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
abd0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
abe0: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
abf0: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
ac00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
ac10: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
ac20: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
ac30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ac40: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
ac50: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
ac60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ac70: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
ac80: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
ac90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
aca0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
acb0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
acc0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
acd0: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
ace0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
acf0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
ad00: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
ad10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ad20: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
ad30: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
ad40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
ad50: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
ad60: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
ad70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
ad80: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
ad90: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
ada0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
adb0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
adc0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
add0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
ade0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
adf0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ae00: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
ae10: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
ae20: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
ae30: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
ae40: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
ae50: 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b  , "%s", "expr");
ae60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ae70: 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a  }..  if( zOp ){.
ae80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ae90: 61 70 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22  appendf(p, "%s("
aea0: 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70  , zOp);.    disp
aeb0: 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 78  layP4Expr(p, pEx
aec0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
aed0: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
aee0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
aef0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c  e3_str_append(p,
af00: 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   ",", 1);.      
af10: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c  displayP4Expr(p,
af20: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
af30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
af40: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c  e3_str_append(p,
af50: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
af60: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
af70: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
af80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
af90: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
afa0: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
afb0: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
afc0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
afd0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
afe0: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
aff0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
b000: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
b010: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
b020: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
b030: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
b040: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
b050: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
b060: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
b070: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
b080: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
b090: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
b0a0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
b0b0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
b0c0: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
b0d0: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
b0e0: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
b0f0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
b100: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
b110: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
b120: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
b130: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
b140: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
b150: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
b160: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
b170: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
b180: 70 70 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64  ppendf(&x, "k(%d
b190: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  ", pKeyInfo->nKe
b1a0: 79 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66  yField);.      f
b1b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
b1c0: 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a  fo->nKeyField; j
b1d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
b1e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
b1f0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
b200: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
b210: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
b220: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
b230: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  me : "";.       
b240: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c   if( strcmp(zCol
b250: 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20  l, "BINARY")==0 
b260: 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20  ) zColl = "B";. 
b270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
b280: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b290: 2c 25 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20  ,%s%s", .       
b2a0: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
b2b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
b2c0: 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c  ? "-" : "", zCol
b2d0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
b2e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b2f0: 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29  pend(&x, ")", 1)
b300: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b310: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
b320: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
b330: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
b340: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
b350: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 26   displayP4Expr(&
b360: 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72  x, pOp->p4.pExpr
b370: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b380: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b390: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
b3a0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
b3b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e  q *pColl = pOp->
b3c0: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  p4.pColl;.      
b3d0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b3e0: 6e 64 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29  ndf(&x, "(%.20s)
b3f0: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  ", pColl->zName)
b400: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b410: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b420: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
b430: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
b440: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b  = pOp->p4.pFunc;
b450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b460: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b470: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
b480: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
b490: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b4a0: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
b4b0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
b4c0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
b4d0: 50 52 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73  PROFILE).    cas
b4e0: 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a  e P4_FUNCCTX: {.
b4f0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
b500: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  Def = pOp->p4.pC
b510: 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20  tx->pFunc;.     
b520: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b530: 65 6e 64 66 28 26 78 2c 20 22 25 73 28 25 64 29  endf(&x, "%s(%d)
b540: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
b550: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
b560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b570: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b580: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
b590: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b5a0: 70 65 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22  pendf(&x, "%lld"
b5b0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
b5c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b5d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
b5e0: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
b5f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b600: 6e 64 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f  ndf(&x, "%d", pO
b610: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
b620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b630: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
b640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b650: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b660: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
b670: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
b680: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b690: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
b6a0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
b6b0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
b6c0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
b6d0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
b6e0: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
b6f0: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
b700: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
b710: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  lags & (MEM_Int|
b720: 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a  MEM_IntReal) ){.
b730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
b740: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b750: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
b760: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
b770: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
b780: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
b790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b7a0: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b7b0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
b7c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
b7d0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
b7e0: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
b7f0: 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c       zP4 = "NULL
b800: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
b810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b820: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
b830: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
b840: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
b850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b860: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b880: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
b890: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
b8a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b8b0: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
b8c0: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
b8d0: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
b8e0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b8f0: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
b900: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
b910: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b920: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
b930: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  RAY: {.      int
b940: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   i;.      int *a
b950: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a  i = pOp->p4.ai;.
b960: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69        int n = ai
b970: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  [0];   /* The fi
b980: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61  rst element of a
b990: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c  n INTARRAY is al
b9a0: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20  ways the.       
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
b9d0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
b9e0: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a  ts to follow */.
b9f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
ba00: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <=n; i++){.     
ba10: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
ba20: 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22  ppendf(&x, ",%d"
ba30: 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20  , ai[i]);.      
ba40: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  }.      zTemp[0]
ba50: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71   = '[';.      sq
ba60: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
ba70: 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20  (&x, "]", 1);.  
ba80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ba90: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
baa0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
bab0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
bac0: 65 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61  endf(&x, "progra
bad0: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
bae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
baf0: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
bb00: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
bb10: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
bb20: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
bb30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bb40: 61 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a  ase P4_TABLE: {.
bb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
bb60: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
bb70: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
bb80: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
bb90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bba0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
bbb0: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
bbc0: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
bbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
bbe0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
bbf0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
bc00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bc10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
bc20: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
bc30: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
bc40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
bc50: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
bc60: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
bc70: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
bc80: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
bc90: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
bca0: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
bcb0: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
bcc0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
bcd0: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
bce0: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
bcf0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
bd00: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
bd10: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
bd20: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
bd30: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
bd40: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
bd50: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
bd60: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
bd70: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
bd80: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
bd90: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
bda0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
bdb0: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
bdc0: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
bdd0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
bde0: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
bdf0: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
be00: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
be10: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
be20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
be30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
be40: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
be50: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
be60: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
be70: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
be80: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
be90: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
bea0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
beb0: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
bec0: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
bed0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
bee0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bef0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
bf00: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
bf10: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
bf20: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
bf30: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
bf40: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
bf50: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
bf60: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
bf70: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
bf80: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
bf90: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
bfa0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
bfb0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
bfc0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
bfd0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
bfe0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
bff0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
c000: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
c010: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
c020: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
c030: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
c040: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
c050: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
c060: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
c070: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
c080: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
c090: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
c0a0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
c0b0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
c0c0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
c0d0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
c0e0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
c0f0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
c100: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
c110: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
c120: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
c130: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
c140: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
c150: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
c160: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
c170: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
c180: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
c190: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
c1a0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
c1b0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
c1c0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
c1d0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
c1e0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
c1f0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
c200: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
c210: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
c220: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
c230: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
c240: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
c250: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
c260: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
c270: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
c280: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
c290: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
c2a0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
c2b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
c2c0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
c2d0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
c2e0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
c2f0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
c300: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
c310: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
c320: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
c330: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
c340: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
c350: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
c360: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
c370: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
c380: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
c390: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
c3a0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
c3b0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
c3c0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
c3d0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
c3e0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
c3f0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
c400: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
c410: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
c420: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c430: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
c440: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
c450: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
c460: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c470: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
c480: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
c490: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
c4a0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
c4b0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
c4c0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
c4d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c4e0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
c4f0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
c500: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
c510: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
c520: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
c530: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
c540: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
c550: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
c560: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
c570: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
c580: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
c590: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
c5a0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
c5b0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
c5c0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
c5d0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
c5e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c5f0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
c600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
c610: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
c620: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
c630: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
c640: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
c650: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
c660: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
c670: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
c680: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
c690: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
c6a0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
c6b0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
c6c0: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
c6d0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
c6e0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
c6f0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
c700: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
c710: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
c720: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
c730: 2c 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a  , VdbeOp *pOp){.
c740: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
c750: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
c760: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
c770: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c780: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
c790: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
c7a0: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
c7b0: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
c7c0: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
c7d0: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
c7e0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
c7f0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
c800: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
c810: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
c820: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
c830: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
c840: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
c850: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
c860: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
c870: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
c880: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
c890: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
c8a0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
c8b0: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
c8c0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
c8d0: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
c8e0: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
c8f0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
c900: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
c910: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
c920: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
c930: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
c940: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
c950: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
c960: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
c970: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
c980: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
c990: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
c9a0: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
c9b0: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
c9c0: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
c9d0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
c9e0: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
c9f0: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   element..*/.sta
ca00: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d  tic void initMem
ca10: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
ca20: 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  t N, sqlite3 *db
ca30: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
ca40: 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29  while( (N--)>0 )
ca50: 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  {.    p->db = db
ca60: 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
ca70: 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73   flags;.    p->s
ca80: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66  zMalloc = 0;.#if
ca90: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
caa0: 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72  .    p->pScopyFr
cab0: 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  om = 0;.#endif. 
cac0: 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f     p++;.  }.}../
cad0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
cae0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
caf0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
cb00: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
cb10: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
cb20: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
cb30: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
cb40: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
cb50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cb60: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
cb70: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
cb80: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
cb90: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
cba0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
cbb0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
cbc0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
cbd0: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
cbe0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
cbf0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
cc00: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
cc10: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
cc20: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
cc30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
cc40: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
cc50: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
cc60: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
cc70: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
cc80: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
cc90: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
cca0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
ccb0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
ccc0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
ccd0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
cce0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
ccf0: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
cd00: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
cd10: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
cd20: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
cd30: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
cd40: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
cd50: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
cd60: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
cd70: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
cd80: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
cd90: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
cda0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
cdb0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
cdc0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
cdd0: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
cde0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
cdf0: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
ce00: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
ce10: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
ce20: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
ce30: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
ce40: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
ce50: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
ce60: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
ce70: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
ce80: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
ce90: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
cea0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
ceb0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
cec0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
ced0: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
cee0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
cef0: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
cf00: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
cf10: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
cf20: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
cf30: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
cf40: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
cf50: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
cf60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cf70: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
cf80: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
cf90: 73 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d  stcase( p->xDel=
cfa0: 3d 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d  =sqlite3VdbeFram
cfb0: 65 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20  eMemDel );.     
cfc0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
cfd0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20  EM_Agg|MEM_Dyn) 
cfe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cff0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
d000: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
d010: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
d020: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d030: 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
d040: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
d050: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
d060: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
d070: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
d080: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
d090: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
d0a0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  <pEnd );.  }.}..
d0b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d0c0: 42 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  BUG./*.** Verify
d0d0: 20 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20   that pFrame is 
d0e0: 61 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d  a valid VdbeFram
d0f0: 65 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75  e pointer.  Retu
d100: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
d110: 0a 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66  .** and false if
d120: 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72   something is wr
d130: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ong..**.** This 
d140: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e  routine is inten
d150: 64 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69  ded for use insi
d160: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
d170: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a  tatements only..
d180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
d190: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56  beFrameIsValid(V
d1a0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
d1b0: 29 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d  ){.  if( pFrame-
d1c0: 3e 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51  >iFrameMagic!=SQ
d1d0: 4c 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43  LITE_FRAME_MAGIC
d1e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
d1f0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
d200: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  f.../*.** This i
d210: 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f  s a destructor o
d220: 6e 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28  n a Mem object (
d230: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
d240: 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
d250: 29 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65  ).** that delete
d260: 73 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65  s the Frame obje
d270: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
d280: 68 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62  hed to it as a b
d290: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lob..**.** This 
d2a0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
d2b0: 20 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d   delete the Fram
d2c0: 65 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49  e right away.  I
d2d0: 74 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68  t merely adds th
d2e0: 65 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20  e.** frame to a 
d2f0: 6c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  list of frames t
d300: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  o be deleted whe
d310: 6e 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73  n the Vdbe halts
d320: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d330: 33 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c  3VdbeFrameMemDel
d340: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
d350: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
d360: 65 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29  e = (VdbeFrame*)
d370: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
d380: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d390: 49 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20  IsValid(pFrame) 
d3a0: 29 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61  );.  pFrame->pPa
d3b0: 72 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76  rent = pFrame->v
d3c0: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70  ->pDelFrame;.  p
d3d0: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
d3e0: 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a  ame = pFrame;.}.
d3f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
d400: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
d410: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
d420: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
d430: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
d440: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
d450: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
d460: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
d470: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
d480: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
d490: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
d4a0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
d4b0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
d4c0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
d4d0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
d4e0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
d4f0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
d500: 64 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28  dMem];.  assert(
d510: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d520: 65 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20  eIsValid(p) );. 
d530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d540: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
d550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
d560: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
d570: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
d580: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d590: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
d5a0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Mem);.  sqlite3V
d5b0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
d5c0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70  (p->v->db, &p->p
d5d0: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
d5e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d5f0: 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d  (p->v->db, p);.}
d600: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d610: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
d620: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
d630: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
d640: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
d650: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
d660: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
d670: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
d680: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
d690: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
d6a0: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
d6b0: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
d6c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
d6d0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
d6e0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
d6f0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
d700: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
d710: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
d720: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
d730: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
d740: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
d750: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
d760: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
d770: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
d780: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
d790: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
d7a0: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
d7b0: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
d7c0: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
d7d0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
d7e0: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
d7f0: 20 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30   PLAN..** 2018-0
d800: 34 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70  4-24:  In p->exp
d810: 6c 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68  lain==2 mode, th
d820: 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65  e OP_Init opcode
d830: 73 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a  s of triggers.**
d840: 20 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c   are also shown,
d850: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75   so that the bou
d860: 6e 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20  ndaries between 
d870: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
d880: 20 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69   and.** each tri
d890: 67 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a  gger are clear..
d8a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
d8b0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
d8c0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
d8d0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
d8e0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
d8f0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
d900: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
d910: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
d920: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
d930: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d950: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
d960: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
d990: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
d9a0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
d9b0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d9e0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
d9f0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
da00: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
da10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
da20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
da30: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
da40: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
da70: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
da80: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
da90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
daa0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
dab0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
dac0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
dad0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
db00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
db10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
db40: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
db50: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
db70: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
db80: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62  t set */.  int b
db90: 4c 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28  ListSubprogs = (
dba0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c  p->explain==1 ||
dbb0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
dbc0: 4c 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29  LITE_TriggerEQP)
dbd0: 21 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20  !=0);.  Op *pOp 
dbe0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
dbf0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
dc00: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
dc10: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
dc20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
dc30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
dc40: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
dc50: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
dc60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
dc70: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
dc80: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
dc90: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
dca0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
dcb0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
dcc0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
dcd0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
dce0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
dcf0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
dd00: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
dd10: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
dd20: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
dd30: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
dd40: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
dd50: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
dd60: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
dd70: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
dd80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
dd90: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
dda0: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
ddb0: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
ddc0: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
ddd0: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
dde0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
ddf0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
de00: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
de10: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
de20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
de30: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
de40: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
de50: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
de60: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
de70: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
de80: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
de90: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
dea0: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
deb0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
dec0: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
ded0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
dee0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
def0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
df00: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
df10: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
df20: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
df30: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
df40: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
df50: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
df60: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
df70: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
df80: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
df90: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
dfa0: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
dfb0: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
dfc0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
dfd0: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
dfe0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
dff0: 70 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75  p;.  if( bListSu
e000: 62 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a  bprogs ){.    /*
e010: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
e020: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
e030: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
e040: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
e050: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
e060: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
e070: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
e080: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
e090: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
e0a0: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
e0b0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
e0c0: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
e0d0: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
e0e0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
e0f0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
e100: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
e110: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
e120: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
e130: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
e140: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
e150: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
e160: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
e170: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
e180: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
e190: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
e1a0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
e1b0: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
e1c0: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
e1d0: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
e1e0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
e1f0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
e200: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
e210: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
e220: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
e230: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
e240: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
e250: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
e260: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
e270: 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31  }.  }..  while(1
e280: 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74  ){  /* Loop exit
e290: 73 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20  s via break */. 
e2a0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
e2b0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20      if( i>=nRow 
e2c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
e2d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e2e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
e2f0: 4e 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  NE;.      break;
e300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e310: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
e320: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
e330: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
e340: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
e350: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
e360: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
e370: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
e380: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
e390: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
e3a0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
e3b0: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
e3c0: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
e3d0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
e3e0: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
e3f0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
e400: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
e410: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
e420: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
e430: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
e440: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
e450: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
e460: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
e470: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
e480: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
e490: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
e4a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68      }..    /* Wh
e4b0: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
e4c0: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
e4d0: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
e4e0: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
e4f0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
e500: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
e510: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
e520: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
e530: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
e540: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
e550: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
e560: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
e570: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
e580: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
e590: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
e5a0: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
e5b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69    */.    if( bLi
e5c0: 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f  stSubprogs && pO
e5d0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
e5e0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
e5f0: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
e600: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
e610: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
e620: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
e630: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
e640: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
e650: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
e660: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
e670: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e680: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
e690: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
e6a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
e6b0: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
e6c0: 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20  e, nSub!=0);.   
e6d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
e6e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e6f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e700: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
e710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e720: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53     }.        apS
e730: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
e740: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
e750: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
e760: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
e770: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70  ogram;.        p
e780: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
e790: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
e7a0: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
e7b0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
e7c0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  *);.        nRow
e7d0: 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f   += pOp->p4.pPro
e7e0: 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  gram->nOp;.     
e7f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e800: 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20   p->explain<2 ) 
e810: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
e820: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
e830: 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a  xplain ) break;.
e840: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
e850: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
e860: 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b  p->pc>1 ) break;
e870: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
e880: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e890: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
e8a0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
e8b0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
e8c0: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
e8d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
e8e0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
e8f0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
e900: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
e910: 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >rc));.    }else
e920: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
e930: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  4;.      if( p->
e940: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
e950: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e960: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
e970: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e980: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
e9b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  unter */.       
e9c0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20   pMem++;.    .  
e9d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
e9e0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
e9f0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ea00: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
ea10: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ea20: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
ea30: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
ea40: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ode */.        a
ea50: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
ea60: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 );.        pMe
ea70: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
ea80: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
ea90: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
eaa0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
eab0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b  ;.        pMem++
eac0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ead0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
eae0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
eaf0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
eb00: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
eb20: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  1 */.      pMem+
eb30: 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +;..      pMem->
eb40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
eb50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
eb60: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
eb90: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
eba0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ebb0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
ebc0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
ebd0: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ebf0: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
ec00: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
ec10: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
ec20: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
ec30: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34  m, 100) ){ /* P4
ec40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
ec50: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ec60: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ec70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ec80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ec90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
eca0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
ecb0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20  Term;.      zP4 
ecc0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
ecd0: 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e   pMem->z, pMem->
ece0: 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  szMalloc);.     
ecf0: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
ed00: 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  z ){.        pMe
ed10: 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
ed20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
ed30: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34  SetStr(pMem, zP4
ed40: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
ed50: 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  8, 0);.      }el
ed60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
ed70: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
ed80: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ed90: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
eda0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
edb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
edc0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
ede0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m++;..      if( 
edf0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
ee00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ee10: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
ee20: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
ee30: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
ee40: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
ee50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
ee60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ee70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
ee80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ee90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
eea0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
eeb0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
eec0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 2;.        sql
eed0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
eee0: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22   pMem->z, "%.2x"
eef0: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a  , pOp->p5);   /*
ef00: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70   P5 */.        p
ef10: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
ef20: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20  E_UTF8;.        
ef30: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66  pMem++;.    .#if
ef40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ef50: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
ef60: 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  TS.        if( s
ef70: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
ef80: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
ef90: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
efa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
efb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
efc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
efd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
efe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eff0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f000: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
f010: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
f020: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
f030: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
f040: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
f050: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
f060: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
f070: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65  else.        pMe
f080: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
f090: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
f0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f0b0: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
f0c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
f0d0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
f0e0: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
f0f0: 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  -1);.      p->pR
f100: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
f110: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d  Mem[1];.      p-
f120: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
f130: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f140: 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20  TE_ROW;.    }.  
f150: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f160: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f170: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
f180: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
f190: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
f1a0: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
f1b0: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
f1c0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
f1d0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
f1e0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
f1f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
f200: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
f210: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
f220: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
f230: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
f240: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
f250: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
f260: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
f270: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
f280: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
f290: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
f2a0: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
f2b0: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
f2c0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
f2d0: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
f2e0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
f2f0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
f300: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
f310: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
f320: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
f330: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
f340: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
f350: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
f360: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
f370: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
f380: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
f390: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
f3a0: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
f3b0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
f3c0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
f3d0: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
f3e0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
f3f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
f400: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
f410: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
f420: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
f430: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
f440: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
f450: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
f460: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
f470: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f480: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
f490: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
f4a0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
f4b0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
f4c0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
f4d0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
f4e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f4f0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
f500: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f510: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
f520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
f530: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
f540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
f550: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
f560: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
f570: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
f580: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
f590: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
f5a0: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
f5b0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
f5c0: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
f5d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
f5e0: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e  ACE */../* An in
f5f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
f600: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
f610: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69  bulk memory avai
f620: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a  lable for use.**
f630: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74   by subcomponent
f640: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  s of a prepared 
f650: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63  statement.  Spac
f660: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f  e is allocated o
f670: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61  ut.** of a Reusa
f680: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20  bleSpace object 
f690: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63  by the allocSpac
f6a0: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f  e() routine belo
f6b0: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75  w..*/.struct Reu
f6c0: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75  sableSpace {.  u
f6d0: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20  8 *pSpace;      
f6e0: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
f6f0: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73  le memory */.  s
f700: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 46 72  qlite3_int64 nFr
f710: 65 65 3b 20 20 20 2f 2a 20 42 79 74 65 73 20 6f  ee;   /* Bytes o
f720: 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  f available memo
f730: 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
f740: 69 6e 74 36 34 20 6e 4e 65 65 64 65 64 3b 20 2f  int64 nNeeded; /
f750: 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68  * Total bytes th
f760: 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  at could not be 
f770: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a  allocated */.};.
f780: 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63  ./* Try to alloc
f790: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
f7a0: 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  of 8-byte aligne
f7b0: 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f  d bulk memory fo
f7c0: 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74  r pBuf.** from t
f7d0: 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  he ReusableSpace
f7e0: 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e   object.  Return
f7f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f800: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d  e allocated.** m
f810: 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73  emory on success
f820: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
f830: 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  nt memory is ava
f840: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a  ilable in the.**
f850: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
f860: 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20  bject, increase 
f870: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
f880: 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c  e.nNeeded.** val
f890: 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  ue by the amount
f8a0: 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74 75   needed and retu
f8b0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
f8c0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e  f pBuf is not in
f8d0: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
f8e0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
f8f0: 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72  e memory has alr
f900: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  eady.** been all
f910: 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  ocated by a prio
f920: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  r call to this r
f930: 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20  outine, so just 
f940: 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a  return a copy.**
f950: 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61   of pBuf and lea
f960: 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ve ReusableSpace
f970: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
f980: 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72  * This allocator
f990: 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20   is employed to 
f9a0: 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64  repurpose unused
f9b0: 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e   slots at the en
f9c0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f  d of the.** opco
f9d0: 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65 70  de array of prep
f9e0: 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f  ared state for o
f9f0: 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64  ther memory need
fa00: 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65  s of the prepare
fa10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a  d.** statement..
fa20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
fa30: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74  allocSpace(.  st
fa40: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
fa50: 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20  ce *p,  /* Bulk 
fa60: 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  memory available
fa70: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
fa80: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
faa0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  * Pointer to a p
fab0: 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  rior allocation 
fac0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
fad0: 36 34 20 6e 42 79 74 65 20 20 20 20 20 20 20 2f  64 nByte       /
fae0: 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
faf0: 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20  y needed */.){. 
fb00: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
fb10: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d  YTE_ALIGNMENT(p-
fb20: 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66  >pSpace) );.  if
fb30: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
fb40: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
fb50: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
fb60: 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65  nByte <= p->nFre
fb70: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46  e ){.      p->nF
fb80: 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  ree -= nByte;.  
fb90: 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70      pBuf = &p->p
fba0: 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b  Space[p->nFree];
fbb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fbc0: 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20    p->nNeeded += 
fbd0: 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  nByte;.    }.  }
fbe0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
fbf0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
fc00: 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72  pBuf) );.  retur
fc10: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
fc20: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
fc30: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
fc40: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
fc50: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
fc60: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
fc70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
fc80: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
fc90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
fca0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
fcb0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
fcc0: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
fcd0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
fce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
fcf0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
fd00: 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69  _INIT || p->magi
fd10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45  c==VDBE_MAGIC_RE
fd20: 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  SET );..  /* The
fd30: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
fd40: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
fd50: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
fd60: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
fd70: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
fd80: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
fd90: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
fda0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
fdb0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
fdc0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
fdd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
fde0: 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  G.  for(i=0; i<p
fdf0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
fe00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
fe10: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
fe20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
fe30: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
fe40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fe50: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
fe60: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
fe70: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
fe80: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
fe90: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
fea0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
feb0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
fec0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
fed0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
fee0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
fef0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
ff00: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
ff10: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
ff20: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
ff30: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
ff40: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
ff50: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
ff60: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
ff70: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
ff80: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
ff90: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
ffa0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
ffb0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
ffc0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
ffd0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
ffe0: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
fff0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
10000 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
10010 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
10020 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
10030 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
10040 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
10050 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
10060 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
10070 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
10080 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
10090 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
100a0 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
100b0 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
100c0 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
100d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
100e0 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
100f0 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
10100 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
10110 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
10120 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
10130 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
10140 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
10150 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
10160 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
10170 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
10180 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
10190 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
101a0 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
101b0 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
101c0 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
101d0 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
101e0 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
101f0 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
10200 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
10210 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
10220 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
10230 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
10240 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
10250 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
10260 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
10270 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
10280 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
10290 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
102a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
102b0 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
102c0 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
102f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10320 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
10330 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
10340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10350 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10360 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
10370 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10390 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
103a0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
103d0 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
103e0 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
103f0 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
10400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10410 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
10420 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
10430 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10450 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
10460 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
10470 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ms */.  int n;  
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
104a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75  ounter */.  stru
104b0 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
104c0 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   x;        /* Re
104d0 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f  usable bulk memo
104e0 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ry */..  assert(
104f0 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
10500 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
10510 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
10520 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10530 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
10540 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
10550 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
10560 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62  ->pParse );.  db
10570 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
10580 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
10590 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
105a0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
105b0 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
105c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
105d0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
105e0 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
105f0 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a  se->nMaxArg;.  .
10600 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72    /* Each cursor
10610 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63   uses a memory c
10620 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20  ell.  The first 
10630 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30  cursor (cursor 0
10640 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61  ) can.  ** use a
10650 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20  Mem[0] which is 
10660 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75 73  not otherwise us
10670 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 70  ed by the VDBE p
10680 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74  rogram.  Allocat
10690 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20  e.  ** space at 
106a0 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b  the end of aMem[
106b0 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20  ] for cursors 1 
106c0 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a  and greater..  *
106d0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f  * See also: allo
106e0 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20  cateCursor()..  
106f0 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75  */.  nMem += nCu
10700 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72  rsor;.  if( nCur
10710 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30  sor==0 && nMem>0
10720 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53   ) nMem++;  /* S
10730 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d  pace for aMem[0]
10740 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65   even if not use
10750 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  d */..  /* Figur
10760 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72  e out how much r
10770 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69  eusable memory i
10780 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74  s available at t
10790 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
107a0 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  ** opcode array.
107b0 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d    This extra mem
107c0 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c  ory will be real
107d0 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65  located for othe
107e0 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  r elements.  ** 
107f0 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 20  of the prepared 
10800 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
10810 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a    n = ROUND8(siz
10820 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b  eof(Op)*p->nOp);
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10840 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65   Bytes of opcode
10850 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a   memory used */.
10860 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28    x.pSpace = &((
10870 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20  u8*)p->aOp)[n]; 
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10890 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d   Unused opcode m
108a0 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
108b0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
108c0 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65  IGNMENT(x.pSpace
108d0 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d  ) );.  x.nFree =
108e0 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72   ROUNDDOWN8(pPar
108f0 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20  se->szOpAlloc - 
10900 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66  n);  /* Bytes of
10910 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a   unused memory *
10920 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46  /.  assert( x.nF
10930 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ree>=0 );.  asse
10940 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
10950 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61  LIGNMENT(&x.pSpa
10960 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a  ce[x.nFree]) );.
10970 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
10980 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
10990 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
109a0 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
109b0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
109c0 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
109d0 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
109e0 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
109f0 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
10a00 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d  m = 10;.  }.  p-
10a10 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
10a20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
10a30 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
10a40 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
10a50 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
10a60 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20  in one or two.  
10a70 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
10a80 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
10a90 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
10aa0 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20  nused memory at 
10ab0 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66  the .  ** end of
10ac0 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
10ad0 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e  y.  If we are un
10ae0 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20  able to satisfy 
10af0 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20  all memory.  ** 
10b00 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
10b10 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
10b20 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
10b30 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
10b40 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69   ** pass will fi
10b50 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  ll in the remain
10b60 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65 73  der using a fres
10b70 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  h memory allocat
10b80 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
10b90 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
10ba0 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
10bb0 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
10bc0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
10bd0 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
10be0 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20  tover memory at 
10bf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
10c00 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
10c10 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  is can significa
10c20 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
10c30 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
10c40 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
10c50 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10c60 6e 74 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e 4e 65  nt..  */.  x.nNe
10c70 65 64 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 61  eded = 0;.  p->a
10c80 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
10c90 28 26 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73 69 7a  (&x, 0, nMem*siz
10ca0 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e  eof(Mem));.  p->
10cb0 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
10cc0 65 28 26 78 2c 20 30 2c 20 6e 56 61 72 2a 73 69  e(&x, 0, nVar*si
10cd0 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d  zeof(Mem));.  p-
10ce0 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
10cf0 61 63 65 28 26 78 2c 20 30 2c 20 6e 41 72 67 2a  ace(&x, 0, nArg*
10d00 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20  sizeof(Mem*));. 
10d10 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
10d20 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 43  cSpace(&x, 0, nC
10d30 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
10d40 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64  eCursor*));.#ifd
10d50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10d60 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
10d70 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61  .  p->anExec = a
10d80 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c  llocSpace(&x, 0,
10d90 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
10da0 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  64));.#endif.  i
10db0 66 28 20 78 2e 6e 4e 65 65 64 65 64 20 29 7b 0a  f( x.nNeeded ){.
10dc0 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70      x.pSpace = p
10dd0 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
10de0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
10df0 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20  b, x.nNeeded);. 
10e00 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e     x.nFree = x.n
10e10 4e 65 65 64 65 64 3b 0a 20 20 20 20 69 66 28 20  Needed;.    if( 
10e20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
10e30 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  d ){.      p->aM
10e40 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
10e50 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
10e60 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
10e70 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20        p->aVar = 
10e80 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
10e90 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
10ea0 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20  eof(Mem));.     
10eb0 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
10ec0 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
10ed0 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
10ee0 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 20 20 70  (Mem*));.      p
10ef0 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
10f00 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73  pace(&x, p->apCs
10f10 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
10f20 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10f30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10f40 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10f50 54 41 54 55 53 0a 20 20 20 20 20 20 70 2d 3e 61  TATUS.      p->a
10f60 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
10f70 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63  ce(&x, p->anExec
10f80 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
10f90 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
10fa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 56    }.  }..  p->pV
10fb0 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70  List = pParse->p
10fc0 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d  VList;.  pParse-
10fd0 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20  >pVList =  0;.  
10fe0 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
10ff0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
11000 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11010 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  iled ){.    p->n
11020 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Var = 0;.    p->
11030 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  nCursor = 0;.   
11040 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->nMem = 0;.  
11050 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43  }else{.    p->nC
11060 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
11070 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
11080 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
11090 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
110a0 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20  aVar, nVar, db, 
110b0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70  MEM_Null);.    p
110c0 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
110d0 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
110e0 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64  p->aMem, nMem, d
110f0 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  b, MEM_Undefined
11100 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  );.    memset(p-
11110 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73  >apCsr, 0, nCurs
11120 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
11130 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
11140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
11150 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
11160 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78    memset(p->anEx
11170 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69  ec, 0, p->nOp*si
11180 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
11190 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
111a0 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
111b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
111c0 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
111d0 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
111e0 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
111f0 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
11200 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
11210 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
11220 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
11230 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
11240 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
11250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
11260 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
11270 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43  x->pBtx==0 || pC
11280 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  x->eCurType==CUR
11290 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
112a0 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75  switch( pCx->eCu
112b0 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  rType ){.    cas
112c0 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  e CURTYPE_SORTER
112d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
112e0 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
112f0 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
11300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11310 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
11320 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20  E_BTREE: {.     
11330 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65   if( pCx->isEphe
11340 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  meral ){.       
11350 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29   if( pCx->pBtx )
11360 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11370 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20  se(pCx->pBtx);. 
11380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
11390 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
113a0 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
113b0 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
113c0 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
113d0 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
113e0 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
113f0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
11400 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
11410 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
11420 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11430 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
11440 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
11450 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11460 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
11470 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11480 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
11490 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
114a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
114b0 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
114c0 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
114d0 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
114e0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
114f0 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
11500 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
11510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
11520 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
11530 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
11540 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
11550 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
11560 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
11570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11580 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
11590 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
115a0 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
115b0 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
115c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
115d0 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
115e0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
115f0 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
11600 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
11610 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
11620 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
11630 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
11640 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
11650 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
11660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11670 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
11680 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
11690 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
116a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
116b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
116c0 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
116d0 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
116e0 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
116f0 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
11700 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
11710 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
11720 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
11730 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
11740 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
11750 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
11760 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
11770 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
11780 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
11790 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
117a0 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
117b0 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
117c0 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
117d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
117e0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
117f0 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
11800 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
11810 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  if.  v->aOp = pF
11820 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
11830 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
11840 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
11850 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
11860 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
11870 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
11880 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
11890 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
118a0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
118b0 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
118c0 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
118d0 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
118e0 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
118f0 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e  ->nChange;.  v->
11900 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46  db->nChange = pF
11910 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b  rame->nDbChange;
11920 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
11930 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64  leteAuxData(v->d
11940 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c  b, &v->pAuxData,
11950 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41   -1, 0);.  v->pA
11960 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d  uxData = pFrame-
11970 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72  >pAuxData;.  pFr
11980 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20  ame->pAuxData = 
11990 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  0;.  return pFra
119a0 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
119b0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
119c0 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
119d0 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
119e0 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
119f0 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
11a00 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
11a10 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
11a20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
11a30 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
11a40 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
11a50 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
11a60 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
11a70 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
11a80 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
11a90 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
11aa0 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
11ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11ac0 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
11ad0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
11ae0 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
11af0 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
11b00 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
11b10 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
11b20 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
11b30 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
11b40 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
11b50 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
11b60 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20  ore(pFrame);.   
11b70 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
11b80 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20      p->nFrame = 
11b90 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11ba0 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b   p->nFrame==0 );
11bb0 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
11bc0 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28  nFrame(p);.  if(
11bd0 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
11be0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
11bf0 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  p->aMem, p->nMem
11c00 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
11c10 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
11c20 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
11c30 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
11c40 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
11c50 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
11c60 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
11c70 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
11c80 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
11c90 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
11ca0 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
11cb0 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
11cc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78  */.  if( p->pAux
11cd0 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64  Data ) sqlite3Vd
11ce0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
11cf0 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  p->db, &p->pAuxD
11d00 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  ata, -1, 0);.  a
11d10 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
11d20 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
11d30 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
11d40 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
11d50 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
11d60 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
11d70 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
11d80 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
11d90 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
11da0 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
11db0 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
11dc0 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
11dd0 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
11de0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
11df0 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
11e00 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
11e10 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
11e20 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
11e30 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
11e40 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
11e50 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
11e60 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74  esColumn){.  int
11e70 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
11e80 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66  b = p->db;..  if
11e90 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  ( p->nResColumn 
11ea0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
11eb0 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
11ec0 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
11ed0 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
11ee0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11ef0 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
11f00 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73  ;.  }.  n = nRes
11f10 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
11f20 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
11f30 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
11f40 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
11f50 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
11f60 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
11f70 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  db, sizeof(Mem)*
11f80 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43  n );.  if( p->aC
11f90 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  olName==0 ) retu
11fa0 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72  rn;.  initMemArr
11fb0 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
11fc0 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  n, db, MEM_Null)
11fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11fe0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
11ff0 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
12000 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
12010 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
12020 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
12030 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
12040 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
12050 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
12060 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
12070 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
12080 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
12090 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
120a0 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
120b0 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
120c0 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
120d0 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
120e0 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
120f0 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
12100 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
12110 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
12120 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
12130 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
12140 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
12150 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
12160 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
12170 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
12180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12190 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
121a0 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
121d0 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
121e0 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
12210 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
12220 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
12230 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
12240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12250 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
12260 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
12270 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12280 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
12290 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
122a0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
122b0 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
122c0 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
122d0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
122e0 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
122f0 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
12300 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
12310 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
12320 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
12330 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
12340 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
12350 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
12360 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
12370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12380 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
12390 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
123a0 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
123b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
123c0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
123d0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
123e0 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
123f0 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
12400 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
12410 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
12420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12430 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
12440 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
12450 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
12460 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
12470 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
12480 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
12490 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
124a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
124b0 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
124c0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
124d0 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
124e0 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
124f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
12500 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
12510 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
12520 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
12530 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
12540 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
12550 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
12560 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
12570 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
12580 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
12590 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
125a0 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
125b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
125c0 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
125d0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
125e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
125f0 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
12600 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
12610 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
12620 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
12630 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
12640 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
12650 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
12660 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20  for a two-phase 
12670 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20  commit using a. 
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12690 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
126a0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  nal */.  int rc 
126b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
126c0 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
126d0 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
126e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
126f0 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
12700 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
12710 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
12720 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
12730 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
12740 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
12750 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
12760 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12770 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
12780 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
12790 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
127a0 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
127b0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
127c0 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
127d0 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
127e0 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
127f0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
12800 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
12810 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
12820 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
12830 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12840 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
12850 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
12860 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
12870 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
12880 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
12890 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
128a0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
128b0 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
128c0 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
128d0 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
128e0 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
128f0 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
12900 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
12910 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
12920 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
12930 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
12940 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
12950 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
12960 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
12970 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
12980 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
12990 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
129a0 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
129b0 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
129c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
129d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
129e0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
129f0 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
12a00 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
12a10 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
12a20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12a30 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12a40 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
12a50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
12a60 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
12a70 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
12a80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
12a90 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
12aa0 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68   a database migh
12ab0 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20  t need a master 
12ac0 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20  journal depends 
12ad0 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74  upon.      ** it
12ae0 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28  s journal mode (
12af0 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e  among other thin
12b00 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69  gs).  This matri
12b10 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  x determines whi
12b20 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  ch.      ** jour
12b30 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20  nal modes use a 
12b40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
12b50 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20  nd which do not 
12b60 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
12b70 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64  const u8 aMJNeed
12b80 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ed[] = {.       
12b90 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20   /* DELETE   */ 
12ba0 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   1,.        /* P
12bb0 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20  ERSIST   */ 1,. 
12bc0 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20         /* OFF   
12bd0 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
12be0 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a    /* TRUNCATE  *
12bf0 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
12c00 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a  MEMORY    */ 0,.
12c10 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20          /* WAL  
12c20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20       */ 0.      
12c30 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  };.      Pager *
12c40 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67  pPager;   /* Pag
12c50 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
12c60 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20  th pBt */.      
12c70 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
12c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
12c90 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
12ca0 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
12cb0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
12cc0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
12cd0 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74  db->aDb[i].safet
12ce0 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53  y_level!=PAGER_S
12cf0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20  YNCHRONOUS_OFF. 
12d00 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64        && aMJNeed
12d10 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47  ed[sqlite3PagerG
12d20 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
12d30 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20 26 26  ager)].       &&
12d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
12d50 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d 30 0a  emdb(pPager)==0.
12d60 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20        ){ .      
12d70 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20 29    assert( i!=1 )
12d80 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73  ;.        nTrans
12d90 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
12da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12db0 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
12dc0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12dd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12de0 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
12df0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
12e00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
12e10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
12e20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
12e30 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
12e40 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
12e50 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
12e60 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
12e70 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
12e80 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
12e90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
12ea0 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
12eb0 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
12ec0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
12ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12ee0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
12ef0 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
12f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
12f10 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
12f20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
12f30 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
12f40 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
12f50 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
12f60 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
12f70 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
12f80 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
12f90 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
12fa0 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
12fb0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
12fc0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
12fd0 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
12fe0 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
12ff0 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
13000 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
13010 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
13020 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
13030 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
13040 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
13050 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
13060 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
13070 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
13080 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
13090 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
130a0 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
130b0 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
130c0 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
130d0 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
130e0 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
130f0 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
13100 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
13110 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
13120 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
13130 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
13140 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
13150 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
13160 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13170 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
13180 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
13190 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
131a0 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
131b0 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
131c0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
131d0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
131e0 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
131f0 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
13200 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
13210 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
13220 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
13230 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
13240 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
13250 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
13260 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
13270 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
13280 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
13290 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
132a0 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
132b0 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
132c0 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
132d0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
132e0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
132f0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
13300 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
13310 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
13320 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
13330 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
13340 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13350 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
13360 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
13370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
133a0 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
133b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
133c0 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
133d0 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
133e0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
133f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
13400 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
13410 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
13420 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
13430 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
13440 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
13450 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
13460 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  cally..  */.#ifn
13470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13480 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
13490 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
134a0 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
134b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
134c0 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
134d0 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
134e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
134f0 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
13500 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
13510 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
13520 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
13530 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
13540 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
13550 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
13560 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
13570 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
13580 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
13590 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
135a0 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
135b0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
135c0 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
135d0 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
135e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
135f0 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
13600 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
13610 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
13620 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
13630 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
13640 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
13650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13660 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20  EM_BKPT;.    do 
13670 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
13680 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dom;.      if( r
13690 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20  etryCount ){.   
136a0 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
136b0 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  unt>100 ){.     
136c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
136d0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
136e0 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a  J delete: %s", z
136f0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13700 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13710 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
13720 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13730 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
13740 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f  else if( retryCo
13750 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unt==1 ){.      
13760 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
13770 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
13780 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a   collide: %s", z
13790 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
137a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
137b0 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20   retryCount++;. 
137c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
137d0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
137e0 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
137f0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
13800 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26  3_snprintf(13, &
13810 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c  zMaster[nMainFil
13820 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32  e], "-mj%06X9%02
13830 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26     (iRandom>>8)&
13860 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f  0xffffff, iRando
13870 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f  m&0xff);.      /
13880 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74  * The antipenult
13890 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20  imate character 
138a0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
138b0 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a  urnal name must.
138c0 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20        ** be "9" 
138d0 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f  to avoid name co
138e0 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73  llisions when us
138f0 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65  ing 8+3 filename
13900 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
13910 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69  rt( zMaster[sqli
13920 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73  te3Strlen30(zMas
13930 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a  ter)-3]=='9' );.
13940 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
13950 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
13960 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
13970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13980 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
13990 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
139a0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
139b0 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
139c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
139d0 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
139e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
139f0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
13a00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13a10 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
13a20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
13a30 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
13a40 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
13a50 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13a60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
13a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13a80 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
13a90 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
13aa0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
13ab0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
13ac0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
13ad0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13af0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13b00 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13b20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
13b30 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
13b40 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
13b50 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
13b60 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
13b70 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
13b80 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
13b90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13ba0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
13bb0 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
13bc0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
13bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
13be0 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
13bf0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
13c00 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
13c10 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
13c20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
13c30 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
13c40 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
13c50 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
13c60 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
13c70 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
13c80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
13c90 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
13ca0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
13cb0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
13cc0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
13cd0 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
13ce0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
13cf0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
13d00 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
13d10 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
13d20 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
13d30 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
13d40 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
13d50 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
13d60 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
13d70 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
13d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
13d90 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
13da0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
13db0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
13dc0 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
13dd0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13de0 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
13df0 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
13e00 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
13e10 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
13e20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
13e50 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
13e60 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
13e70 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
13e80 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
13e90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13ea0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
13eb0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
13ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13ee0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
13ef0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13f00 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
13f10 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
13f20 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
13f30 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
13f40 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
13f50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13f60 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
13f70 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
13f80 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
13f90 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
13fa0 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
13fb0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
13fc0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
13fd0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
13fe0 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
13ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
14000 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
14010 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
14020 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
14030 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
14040 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14050 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
14060 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
14080 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
14090 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
140a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
140b0 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
140c0 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
140d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
140e0 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
140f0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
14100 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
14110 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
14120 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
14130 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14140 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
14150 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
14160 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14170 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
14180 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
14190 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
141a0 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
141b0 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
141c0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
141d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
141e0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
141f0 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
14200 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
14210 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
14220 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
14230 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
14240 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14250 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
14260 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
14270 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
14280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
14290 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
142a0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
142b0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
142c0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
142d0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
142e0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
142f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14300 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14310 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
14320 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14330 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
14340 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
14350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
14360 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
14370 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14390 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
143a0 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
143b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
143c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
143d0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
143e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
143f0 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
14400 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
14410 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
14420 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
14430 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
14440 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
14450 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
14460 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
14470 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
14480 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
14490 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
144a0 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
144b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
144c0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
144d0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
144e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
144f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14500 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
14510 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
14520 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
14530 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
14540 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
14550 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
14560 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
14570 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
14580 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
14590 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
145a0 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
145b0 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
145c0 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
145d0 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
145e0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
145f0 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
14600 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
14610 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
14620 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
14630 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
14640 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
14650 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
14660 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
14670 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
14680 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
14690 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
146a0 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
146b0 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
146c0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
146d0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
146e0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
146f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
14710 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
14720 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
14730 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
14740 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
14750 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14760 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14770 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20  eTwo(pBt, 1);.  
14780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14790 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
147a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
147b0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
147c0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
147d0 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
147e0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
147f0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
14800 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
14810 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
14820 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
14830 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e  nVdbeActive coun
14840 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
14850 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
14860 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
14870 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
14880 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
14890 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
148a0 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
148b0 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
148c0 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
148d0 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
148e0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
148f0 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
14900 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
14910 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
14920 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
14930 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
14940 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
14950 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
14960 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
14970 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
14980 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
14990 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
149a0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
149b0 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b   int nWrite = 0;
149c0 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30  .  int nRead = 0
149d0 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
149e0 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
149f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14a00 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69  _stmt_busy((sqli
14a10 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a  te3_stmt*)p) ){.
14a20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
14a30 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e     if( p->readOn
14a40 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b  ly==0 ) nWrite++
14a50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62  ;.      if( p->b
14a60 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64  IsReader ) nRead
14a70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
14a80 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
14a90 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
14aa0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
14ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
14ac0 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  te==db->nVdbeWri
14ad0 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
14ae0 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65  nRead==db->nVdbe
14af0 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Read );.}.#else.
14b00 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
14b10 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
14b20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
14b30 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
14b40 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
14b50 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
14b60 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
14b70 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
14b80 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
14b90 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
14ba0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
14bb0 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
14bc0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
14bd0 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
14be0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
14bf0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
14c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14c10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
14c20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
14c30 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
14c40 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
14c50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14c60 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
14c70 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
14c80 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54  occurs, an SQLIT
14c90 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
14ca0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14cb0 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
14cc0 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
14cd0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
14ce0 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43  INLINE int vdbeC
14cf0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
14d00 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
14d10 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73  .  sqlite3 *cons
14d20 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  t db = p->db;.  
14d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14d40 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  OK;.  int i;.  c
14d50 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
14d60 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
14d70 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74  ent-1;..  assert
14d80 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
14d90 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
14da0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
14db0 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ASE);.  assert( 
14dc0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
14dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14de0 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
14df0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
14e00 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
14e10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
14e20 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
14e30 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
14e40 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65  TE_OK;.    Btree
14e50 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
14e60 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
14e70 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pBt ){.      if(
14e80 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
14e90 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14ea0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14eb0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
14ec0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
14ed0 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
14ee0 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
14ef0 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
14f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14f10 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
14f20 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
14f30 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
14f40 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
14f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
14f80 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
14f90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
14fa0 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
14fb0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
14fc0 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0;..  if( rc==SQ
14fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14fe0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
14ff0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
15000 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15010 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
15020 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
15030 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
15040 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
15050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15060 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15070 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
15080 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
15090 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
150a0 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  int);.    }.  }.
150b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
150c0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
150d0 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
150e0 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
150f0 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  store the .  ** 
15100 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
15110 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
15120 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
15130 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
15140 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20   when .  ** the 
15150 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
15160 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
15170 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d  .  */.  if( eOp=
15180 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
15190 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  ACK ){.    db->n
151a0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
151b0 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
151c0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
151d0 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  dImmCons = p->nS
151e0 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20  tmtDefImmCons;. 
151f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15200 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
15210 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
15220 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
15230 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  ){.  if( p->db->
15240 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
15250 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
15260 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c     return vdbeCl
15270 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
15280 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eOp);.  }.  retu
15290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
152a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
152b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
152c0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
152d0 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
152e0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
152f0 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
15300 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
15310 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
15320 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
15330 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
15340 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
15350 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
15360 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
15370 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
15380 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
15390 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
153a0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
153b0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
153c0 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
153d0 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
153e0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
153f0 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
15400 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
15410 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
15420 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
15430 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
15440 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
15450 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
15460 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
15470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15480 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
15490 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
154a0 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
154b0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
154c0 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
154d0 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
154e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
154f0 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
15500 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
15510 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
15520 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
15530 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
15540 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
15550 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
15560 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
15570 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
15580 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
15590 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
155a0 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rt;.    sqlite3V
155b0 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52  dbeError(p, "FOR
155c0 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
155d0 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
155e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
155f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
15600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15610 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
15620 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15630 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
15640 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
15650 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
15660 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
15670 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
15680 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
15690 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
156a0 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
156b0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
156c0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
156d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
156e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
156f0 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
15700 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
15710 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
15720 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
15730 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
15740 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
15750 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
15760 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
15770 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
15780 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
15790 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
157a0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
157b0 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
157c0 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
157d0 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
157e0 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
157f0 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
15800 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
15810 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
15820 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
15830 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
15840 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
15850 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
15860 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
15870 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
15880 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
15890 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
158a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
158b0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
158c0 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
158d0 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
158e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
158f0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
15900 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
15910 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
15920 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
15930 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
15940 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
15950 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
15960 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
15970 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
15980 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
15990 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
159a0 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
159b0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
159c0 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
159d0 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
159e0 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
159f0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
15a00 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
15a10 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
15a20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
15a30 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
15a40 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
15a50 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
15a60 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
15a70 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
15a80 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
15a90 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
15aa0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
15ab0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
15ac0 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
15ad0 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
15ae0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
15af0 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
15b00 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
15b10 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
15b20 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
15b30 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
15b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15b50 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
15b60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
15b70 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
15b80 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
15b90 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
15ba0 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63  rs(p);.  checkAc
15bb0 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
15bc0 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74  ..  /* No commit
15bd0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65   or rollback nee
15be0 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72  ded if the progr
15bf0 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64  am never started
15c00 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20   or if the.  ** 
15c10 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f  SQL statement do
15c20 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77  es not read or w
15c30 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20  rite a database 
15c40 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  file.  */.  if( 
15c50 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62  p->pc>=0 && p->b
15c60 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  IsReader ){.    
15c70 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
15c80 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
15c90 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20   from p->rc */. 
15ca0 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e     int eStatemen
15cb0 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  tOp = 0;.    int
15cc0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b   isSpecialError;
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15ce0 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20  et to true if a 
15cf0 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20  'special' error 
15d00 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
15d10 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
15d20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
15d30 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
15d40 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20  dbeEnter(p);..  
15d50 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
15d60 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
15d70 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
15d80 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
15d90 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
15da0 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
15db0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
15dc0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
15df0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
15e00 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
15e10 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
15e20 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
15e30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
15e40 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
15e50 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
15e60 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
15e70 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
15e80 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
15e90 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
15ea0 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
15eb0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
15ec0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
15ed0 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
15ee0 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
15ef0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
15f00 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
15f10 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
15f20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15f30 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
15f40 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
15f50 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
15f60 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
15f70 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
15f80 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
15f90 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
15fa0 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
15fb0 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
15fc0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77  occurred while w
15fd0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
15fe0 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e  urnal, sub-journ
15ff0 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20  al or database. 
16000 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
16010 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72  part of an effor
16020 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63  t to free up cac
16030 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75  he space (see fu
16040 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
16050 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
16060 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72   pager.c), the r
16070 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69  ollback is requi
16080 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a  red to restore .
16090 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67        ** the pag
160a0 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65  er to a consiste
160b0 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
160c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  */.      if( !p-
160d0 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  >readOnly || mrc
160e0 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
160f0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
16100 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  ( (mrc==SQLITE_N
16110 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
16120 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e  ITE_FULL) && p->
16130 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
16140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  ){.          eSt
16150 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
16160 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
16170 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16180 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
16190 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
161a0 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
161b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
161c0 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
161d0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
161e0 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
161f0 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
16200 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
16210 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
16220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
16230 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
16240 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
16250 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
16260 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16270 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
16280 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
16290 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
162a0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
162b0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
162c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
162d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
162e0 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74  eck for immediat
162f0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  e foreign key vi
16300 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  olations. */.   
16310 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
16320 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
16330 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
16340 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
16350 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73  rror) ){.      s
16360 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
16370 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  k(p, 0);.    }. 
16380 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
16390 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
163a0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
163b0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
163c0 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
163d0 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
163e0 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
163f0 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
16400 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
16410 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
16420 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
16430 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
16440 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
16450 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
16460 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
16470 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
16480 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
16490 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
164a0 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
164b0 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
164c0 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
164d0 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d  >nVdbeWrite==(p-
164e0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
164f0 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
16500 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16510 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
16520 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
16530 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
16540 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16550 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
16560 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
16570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16590 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
165a0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
165b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
165c0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
165d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
165e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
165f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16600 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16610 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
16620 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d  GNKEY;.        }
16630 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
16640 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
16650 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
16660 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
16670 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
16680 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
16690 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
166a0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
166b0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
166c0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
166d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
166e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
166f0 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
16700 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
16710 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
16720 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
16730 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
16740 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
16750 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
16760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
16780 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
16790 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
167a0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
167b0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
167c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
167d0 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
167e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
167f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16800 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
16810 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
16820 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
16830 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
16840 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16850 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
16860 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
16870 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
16880 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
16890 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
168a0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
168b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
168c0 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72  u64)SQLITE_Defer
168d0 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73  FKs;.          s
168e0 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
168f0 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
16900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16920 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
16930 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
16940 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
16950 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16960 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74   }.      db->nSt
16970 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
16980 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
16990 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20  ementOp==0 ){.  
169a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
169b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
169c0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
169d0 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ail ){.        e
169e0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
169f0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b  VEPOINT_RELEASE;
16a00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16a10 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
16a20 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
16a30 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
16a40 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
16a50 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65  LLBACK;.      }e
16a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
16a70 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
16a80 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
16a90 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
16aa0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
16ab0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
16ac0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
16ad0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
16ae0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16af0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16b00 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65  }.  .    /* If e
16b10 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e  StatementOp is n
16b20 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
16b30 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
16b40 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20  ction needs to. 
16b50 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74     ** be committ
16b60 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
16b70 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56  k. Call sqlite3V
16b80 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
16b90 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  t() to.    ** do
16ba0 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65   so. If this ope
16bb0 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ration returns a
16bc0 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65  n error, and the
16bd0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
16be0 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  nt.    ** error 
16bf0 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f  code is SQLITE_O
16c00 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53  K or SQLITE_CONS
16c10 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f  TRAINT, then pro
16c20 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  mote the.    ** 
16c30 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
16c40 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  t error code..  
16c50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
16c60 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
16c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
16c80 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
16c90 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
16ca0 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
16cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
16cc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16cd0 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
16ce0 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
16cf0 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  INT ){.         
16d00 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
16d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
16d20 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
16d30 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
16d40 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
16d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d60 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
16d70 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
16d80 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
16d90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16da0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
16db0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
16dc0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
16dd0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
16de0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
16df0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16e00 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
16e10 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
16e20 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
16e30 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
16e40 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
16e50 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
16e60 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
16e70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16e80 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
16e90 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
16ea0 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
16eb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
16ec0 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
16ed0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
16ee0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16ef0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
16f00 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
16f10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16f30 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
16f40 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
16f50 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
16f60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16f70 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
16f80 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
16f90 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
16fa0 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
16fb0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
16fc0 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
16fd0 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
16fe0 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
16ff0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
17000 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69     db->nVdbeActi
17010 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  ve--;.    if( !p
17020 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d  ->readOnly ) db-
17030 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20  >nVdbeWrite--;. 
17040 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
17050 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52  der ) db->nVdbeR
17060 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ead--;.    asser
17070 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
17080 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ve>=db->nVdbeRea
17090 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
170a0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d   db->nVdbeRead>=
170b0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
170c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
170d0 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20  ->nVdbeWrite>=0 
170e0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
170f0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
17100 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
17110 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
17120 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17130 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
17140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
17150 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
17160 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
17170 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
17180 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
17190 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
171a0 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
171b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
171c0 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
171d0 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
171e0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
171f0 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
17200 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
17210 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
17220 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
17230 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
17240 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
17250 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
17260 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
17270 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
17280 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
17290 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
172a0 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
172b0 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
172c0 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
172d0 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
172e0 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
172f0 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
17300 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
17310 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
17320 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
17330 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
17340 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
17350 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
17360 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
17370 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
17380 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
17390 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
173a0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
173b0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
173c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
173d0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
173e0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
173f0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
17400 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
17410 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
17420 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
17430 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
17440 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
17450 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
17460 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
17470 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
17480 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
17490 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
174a0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
174b0 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
174c0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
174d0 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
174e0 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
174f0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
17500 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
17510 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
17520 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
17530 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
17540 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
17550 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
17560 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 64  zErrMsg ){.    d
17570 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
17580 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ++;.    sqlite3B
17590 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
175a0 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ();.    if( db->
175b0 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45  pErr==0 ) db->pE
175c0 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  rr = sqlite3Valu
175d0 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71  eNew(db);.    sq
175e0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
175f0 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
17600 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
17610 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
17620 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
17630 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
17640 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
17650 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d  >bBenignMalloc--
17660 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
17670 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->pErr ){.    sq
17680 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e 75 6c  lite3ValueSetNul
17690 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d  l(db->pErr);.  }
176a0 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d  .  db->errCode =
176b0 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   rc;.  return rc
176c0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
176d0 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
176e0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
176f0 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
17700 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
17710 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
17720 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
17730 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
17740 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
17750 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
17760 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
17770 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17780 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
17790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
177a0 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
177b0 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
177c0 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
177d0 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
177e0 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
177f0 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
17800 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
17810 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
17820 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
17830 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17840 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
17850 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
17860 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
17870 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
17880 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
17890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
178a0 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
178b0 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
178c0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
178d0 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
178e0 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
178f0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
17900 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
17910 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
17920 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
17930 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
17940 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
17950 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
17960 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
17970 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
17980 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
17990 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
179a0 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
179b0 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
179c0 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
179d0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
179e0 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
179f0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
17a00 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
17a10 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
17a20 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
17a30 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
17a40 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
17a50 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
17a60 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
17a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17a80 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
17a90 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
17aa0 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
17ab0 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
17ac0 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
17ad0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  if..  sqlite3 *d
17ae0 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
17af0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
17b00 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
17b10 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
17b20 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
17b30 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
17b40 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
17b50 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
17b60 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
17b70 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
17b80 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17b90 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
17ba0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
17bb0 61 73 20 62 65 65 6e 20 72 75 6e 20 65 76 65 6e  as been run even
17bc0 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
17bd0 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
17be0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
17bf0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
17c00 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
17c10 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
17c20 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
17c30 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
17c40 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
17c50 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
17c60 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
17c70 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
17c80 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
17c90 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
17ca0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
17cb0 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
17cc0 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
17cd0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
17ce0 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f   ){.    vdbeInvo
17cf0 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20  keSqllog(p);.   
17d00 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
17d10 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
17d20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
17d30 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
17d40 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
17d50 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
17d60 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
17d70 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
17d80 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
17d90 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
17da0 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
17db0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
17dc0 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
17dd0 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
17de0 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
17df0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
17e00 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
17e10 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
17e20 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
17e30 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
17e40 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
17e50 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73  p->rc, p->zErrMs
17e60 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d  g ? "%s" : 0, p-
17e70 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a  >zErrMsg);.  }..
17e80 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67 69 73    /* Reset regis
17e90 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64  ter contents and
17ea0 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72 20 6d   reclaim error m
17eb0 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e 0a 20  essage memory.. 
17ec0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
17ed0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
17ee0 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
17ef0 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
17f00 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
17f10 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
17f20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
17f30 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
17f40 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
17f50 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  up.  */.  if( p-
17f60 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30  >apCsr ) for(i=0
17f70 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
17f80 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
17f90 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20  apCsr[i]==0 );. 
17fa0 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
17fb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
17fc0 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
17fd0 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
17fe0 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
17ff0 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
18000 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
18010 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
18020 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
18030 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
18040 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66 64 65  ltSet = 0;.#ifde
18050 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
18060 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30 3b 0a   p->nWrite = 0;.
18070 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 61 76  #endif..  /* Sav
18080 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
18090 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
180a0 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
180b0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
180c0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
180d0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
180e0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
180f0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
18100 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 66 70   out ){.      fp
18110 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
18120 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
18130 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
18140 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
18150 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
18160 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
18170 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
18180 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18190 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
181a0 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
181b0 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
181c0 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
181d0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
181e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
181f0 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
18200 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
18210 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
18220 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
18230 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
18240 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
18250 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
18260 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
18270 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
18280 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
18290 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
182a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
182b0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
182c0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
182d0 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
182e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
182f0 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
18300 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
18310 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
18320 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
18330 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
18340 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
18350 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
18360 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
18370 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
18380 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
18390 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
183a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
183b0 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
183c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
183d0 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
183e0 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
183f0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
18400 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
18410 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
18420 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
18430 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72  C_RESET;.  retur
18440 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
18450 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
18460 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
18470 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
18480 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
18490 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
184a0 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
184b0 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
184c0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
184d0 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
184e0 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
184f0 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
18500 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
18510 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18520 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
18530 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
18540 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
18550 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
18560 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
18570 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
18580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18590 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
185a0 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
185b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
185c0 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
185d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
185e0 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
185f0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
18600 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
18610 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
18620 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
18630 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
18640 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
18650 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
18660 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
18670 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
18680 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
18690 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
186a0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
186b0 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
186c0 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
186d0 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
186e0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
186f0 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
18700 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
18710 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
18720 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
18730 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
18740 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
18750 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
18760 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
18770 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
18780 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
18790 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
187a0 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
187b0 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
187c0 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
187d0 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
187e0 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
187f0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
18800 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
18810 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
18820 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
18830 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
18840 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
18850 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
18860 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
18870 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
18880 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75  (sqlite3 *db, Au
18890 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20  xData **pp, int 
188a0 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
188b0 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
188c0 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
188d0 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
188e0 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
188f0 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d   (pAux->iAuxOp==
18900 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20 26 26  iOp.          &&
18910 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d   pAux->iAuxArg>=
18920 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
18930 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 33 31  pAux->iAuxArg>31
18940 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
18950 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 75  KBIT32(pAux->iAu
18960 78 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  xArg)))).    ){.
18970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18980 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33  pAux->iAuxArg==3
18990 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
189a0 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 20  Aux->xDeleteAux 
189b0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
189c0 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41 75 78  >xDeleteAux(pAux
189d0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
189e0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
189f0 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20  x->pNextAux;.   
18a00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18a10 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  (db, pAux);.    
18a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
18a30 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78   &pAux->pNextAux
18a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18a50 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
18a60 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
18a70 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
18a80 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18a90 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
18aa0 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
18ab0 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
18ac0 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
18ad0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
18ae0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
18af0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
18b00 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
18b10 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
18b20 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
18b30 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
18b40 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
18b50 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
18b60 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
18b70 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
18b80 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
18b90 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
18ba0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
18bb0 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
18bc0 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
18bd0 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
18be0 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
18bf0 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
18c00 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
18c10 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
18c20 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
18c30 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
18c40 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
18c50 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
18c60 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
18c70 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
18c80 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
18c90 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
18ca0 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
18cb0 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
18cc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18cd0 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
18ce0 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
18cf0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b  BE_MAGIC_INIT ){
18d00 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
18d10 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
18d20 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  >nVar);.    sqli
18d30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18d40 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71  >pVList);.    sq
18d50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18d60 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  p->pFree);.  }. 
18d70 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
18d80 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
18d90 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
18da0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
18db0 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
18dc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
18dd0 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Sql);.#ifdef SQL
18de0 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
18df0 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 62  LIZE.  sqlite3Db
18e00 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 6f 72  Free(db, p->zNor
18e10 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20 20 20 44  mSql);.  {.    D
18e20 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 54 68 69  blquoteStr *pThi
18e30 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 66  s, *pNext;.    f
18e40 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70 44 62 6c  or(pThis=p->pDbl
18e50 53 74 72 3b 20 70 54 68 69 73 3b 20 70 54 68 69  Str; pThis; pThi
18e60 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  s=pNext){.      
18e70 70 4e 65 78 74 20 3d 20 70 54 68 69 73 2d 3e 70  pNext = pThis->p
18e80 4e 65 78 74 53 74 72 3b 0a 20 20 20 20 20 20 73  NextStr;.      s
18e90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18ea0 20 70 54 68 69 73 29 3b 0a 20 20 20 20 7d 0a 20   pThis);.    }. 
18eb0 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
18ec0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18ed0 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
18ee0 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
18ef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
18f00 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  nScan; i++){.   
18f10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18f20 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
18f30 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
18f40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18f50 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
18f60 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
18f70 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
18f80 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
18f90 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
18fa0 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
18fb0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
18fc0 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
18fd0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
18fe0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18ff0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
19000 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
19010 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
19020 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28  ct(db, p);.  if(
19030 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
19040 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
19050 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
19060 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19070 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
19080 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
19090 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
190a0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
190b0 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
190c0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
190d0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
190e0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
190f0 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
19100 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19110 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  NN(db, p);.}../*
19120 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
19130 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
19140 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
19150 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
19160 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
19170 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
19180 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
19190 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
191a0 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
191b0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
191c0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
191d0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
191e0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
191f0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
19200 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
19210 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
19220 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
19230 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
19240 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
19250 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
19260 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
19270 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
19280 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
19290 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
192a0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
192b0 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
192c0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
192d0 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75  packed(p->uc.pCu
192e0 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
192f0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
19300 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
19310 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
19320 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
19330 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19340 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
19350 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
19360 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
19370 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
19380 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
19390 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
193a0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
193b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
193c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
193d0 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
193e0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
193f0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
19400 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
19410 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
19420 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
19430 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
19440 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
19450 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
19460 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
19470 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
19480 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
19490 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
194a0 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
194b0 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
194c0 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
194d0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
194e0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
194f0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
19500 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
19510 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
19520 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
19530 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
19540 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
19550 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
19560 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
19570 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
19580 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
19590 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
195a0 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72  sert( p->uc.pCur
195b0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
195c0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
195d0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
195e0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b  ->uc.pCursor) );
195f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
19600 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
19610 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  e(p->uc.pCursor,
19620 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
19630 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
19640 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
19650 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
19660 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
19670 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
19680 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19690 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
196a0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
196b0 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
196c0 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
196d0 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
196e0 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
196f0 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
19700 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
19710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
19720 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
19730 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
19740 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
19750 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
19760 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  REE );.  if( sql
19770 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
19780 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
19790 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
197a0 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
197b0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
197c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
197d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
197e0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
197f0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
19800 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
19810 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
19820 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
19830 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
19840 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19850 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
19860 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
19870 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
19880 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
19890 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
198a0 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
198b0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
198c0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
198d0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
198e0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
198f0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
19900 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
19910 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
19920 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
19930 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
19940 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
19950 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
19960 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
19970 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
19980 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
19990 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
199a0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
199b0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
199c0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
199d0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
199e0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
199f0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
19a00 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
19a10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
19a20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
19a30 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
19a40 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
19a50 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74  Cursor **pp, int
19a60 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65   *piCol){.  Vdbe
19a70 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b  Cursor *p = *pp;
19a80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
19a90 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
19aa0 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75 72  BTREE || p->eCur
19ab0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53  Type==CURTYPE_PS
19ac0 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20 70 2d  EUDO );.  if( p-
19ad0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
19ae0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 70 3b  ){.    int iMap;
19af0 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74  .    if( p->aAlt
19b00 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70  Map && (iMap = p
19b10 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43  ->aAltMap[1+*piC
19b20 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  ol])>0 ){.      
19b30 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72  *pp = p->pAltCur
19b40 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f  sor;.      *piCo
19b50 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20  l = iMap - 1;.  
19b60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19b70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
19b80 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
19b90 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
19ba0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
19bb0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
19bc0 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
19bd0 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
19be0 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
19bf0 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
19c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19c10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
19c20 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
19c30 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
19c40 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
19c50 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19c60 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
19c70 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19c80 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
19c90 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
19ca0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
19cb0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
19cc0 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
19cd0 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
19ce0 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
19cf0 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
19d00 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
19d10 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
19d20 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
19d30 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
19d40 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
19d50 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
19d60 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
19d70 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
19d80 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
19d90 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
19da0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
19db0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
19dc0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
19dd0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
19de0 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
19df0 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
19e00 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
19e10 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
19e20 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
19e30 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
19e40 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
19e50 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
19e60 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
19e70 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
19e80 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
19e90 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
19ea0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
19eb0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
19ec0 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
19ed0 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
19ee0 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
19ef0 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
19f00 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
19f10 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
19f20 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
19f30 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
19f40 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
19f50 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
19f60 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
19f70 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
19f80 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
19f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
19fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
19fb0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
19fd0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
19fe0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
1a000 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
1a010 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
1a020 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1a030 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
1a040 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
1a050 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
1a080 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
1a090 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
1a0a0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
1a0b0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
1a0c0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
1a0f0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
1a100 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
1a120 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
1a130 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
1a140 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
1a150 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
1a160 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
1a170 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
1a190 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
1a1a0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
1a1b0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
1a1d0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
1a1e0 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
1a1f0 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
1a220 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
1a230 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
1a240 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
1a250 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
1a260 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
1a270 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
1a280 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
1a290 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
1a2a0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
1a2b0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
1a2c0 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
1a2d0 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
1a2e0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
1a2f0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
1a300 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
1a310 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
1a320 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
1a330 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
1a340 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2a  ored in pMem..**
1a350 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a360 20 6d 69 67 68 74 20 63 6f 6e 76 65 72 74 20 61   might convert a
1a370 20 6c 61 72 67 65 20 4d 45 4d 5f 49 6e 74 52 65   large MEM_IntRe
1a380 61 6c 20 76 61 6c 75 65 20 69 6e 74 6f 20 4d 45  al value into ME
1a390 4d 5f 52 65 61 6c 2e 0a 2a 2f 0a 75 33 32 20 73  M_Real..*/.u32 s
1a3a0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a3b0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
1a3c0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  int file_format,
1a3d0 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69   u32 *pLen){.  i
1a3e0 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
1a3f0 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b  >flags;.  u32 n;
1a400 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e  ..  assert( pLen
1a410 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61  !=0 );.  if( fla
1a420 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1a430 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
1a440 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a450 20 20 69 66 28 20 66 6c 61 67 73 26 28 4d 45 4d    if( flags&(MEM
1a460 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
1a470 29 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  ) ){.    /* Figu
1a480 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
1a490 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
1a4a0 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
1a4b0 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
1a4c0 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
1a4d0 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
1a4e0 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
1a4f0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
1a500 75 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  u;.    testcase(
1a510 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74   flags & MEM_Int
1a520 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1a530 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ( flags & MEM_In
1a540 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 69 66 28  tReal );.    if(
1a550 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20   i<0 ){.      u 
1a560 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = ~i;.    }else{
1a570 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
1a580 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
1a590 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  27 ){.      if( 
1a5a0 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
1a5b0 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
1a5c0 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b        *pLen = 0;
1a5d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a5e0 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20  8+(u32)u;.      
1a5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
1a600 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  pLen = 1;.      
1a610 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1a620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a630 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70  ( u<=32767 ){ *p
1a640 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20  Len = 2; return 
1a650 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  2; }.    if( u<=
1a660 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e  8388607 ){ *pLen
1a670 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20   = 3; return 3; 
1a680 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  }.    if( u<=214
1a690 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e  7483647 ){ *pLen
1a6a0 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20   = 4; return 4; 
1a6b0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  }.    if( u<=MAX
1a6c0 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20  _6BYTE ){ *pLen 
1a6d0 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d  = 6; return 5; }
1a6e0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
1a6f0 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45      if( flags&ME
1a700 4d 5f 49 6e 74 52 65 61 6c 20 29 7b 0a 20 20 20  M_IntReal ){.   
1a710 20 20 20 2f 2a 20 49 66 20 74 68 65 20 76 61 6c     /* If the val
1a720 75 65 20 69 73 20 49 6e 74 52 65 61 6c 20 61 6e  ue is IntReal an
1a730 64 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 74 61  d is going to ta
1a740 6b 65 20 75 70 20 38 20 62 79 74 65 73 20 74 6f  ke up 8 bytes to
1a750 20 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20   store.      ** 
1a760 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  as an integer, t
1a770 68 65 6e 20 77 65 20 6d 69 67 68 74 20 61 73 20  hen we might as 
1a780 77 65 6c 6c 20 6d 61 6b 65 20 69 74 20 61 6e 20  well make it an 
1a790 38 2d 62 79 74 65 20 66 6c 6f 61 74 69 6e 67 0a  8-byte floating.
1a7a0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 76        ** point v
1a7b0 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 70 4d  alue */.      pM
1a7c0 65 6d 2d 3e 75 2e 72 20 3d 20 28 64 6f 75 62 6c  em->u.r = (doubl
1a7d0 65 29 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  e)pMem->u.i;.   
1a7e0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26     pMem->flags &
1a7f0 3d 20 7e 4d 45 4d 5f 49 6e 74 52 65 61 6c 3b 0a  = ~MEM_IntReal;.
1a800 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a810 73 20 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  s |= MEM_Real;. 
1a820 20 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20       return 7;. 
1a830 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1a840 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
1a850 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
1a860 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
1a870 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
1a880 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1a890 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a8a0 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
1a8b0 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
1a8c0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1a8d0 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
1a8e0 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
1a8f0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
1a900 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
1a910 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
1a920 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20  }.  *pLen = n;. 
1a930 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
1a940 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
1a950 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
1a960 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
1a970 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  for serial types
1a980 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a   less than 128.*
1a990 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1a9a0 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
1a9b0 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
1a9c0 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20        /*  0   1 
1a9d0 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20    2   3   4   5 
1a9e0 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20    6   7   8   9 
1a9f0 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20  */   ./*   0 */ 
1aa00 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
1aa10 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c    4,  6,  8,  8,
1aa20 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20    0,  0,./*  10 
1aa30 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
1aa40 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20   0,  1,  1,  2, 
1aa50 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20   2,  3,  3,./*  
1aa60 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20  20 */   4,  4,  
1aa70 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20  5,  5,  6,  6,  
1aa80 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f  7,  7,  8,  8,./
1aa90 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39  *  30 */   9,  9
1aaa0 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31  , 10, 10, 11, 11
1aab0 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33  , 12, 12, 13, 13
1aac0 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c  ,./*  40 */  14,
1aad0 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c   14, 15, 15, 16,
1aae0 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c   16, 17, 17, 18,
1aaf0 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20   18,./*  50 */  
1ab00 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20  19, 19, 20, 20, 
1ab10 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20  21, 21, 22, 22, 
1ab20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a  23, 23,./*  60 *
1ab30 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32  /  24, 24, 25, 2
1ab40 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32  5, 26, 26, 27, 2
1ab50 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37  7, 28, 28,./*  7
1ab60 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30  0 */  29, 29, 30
1ab70 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32  , 30, 31, 31, 32
1ab80 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a  , 32, 33, 33,./*
1ab90 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c    80 */  34, 34,
1aba0 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c   35, 35, 36, 36,
1abb0 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c   37, 37, 38, 38,
1abc0 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20  ./*  90 */  39, 
1abd0 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20  39, 40, 40, 41, 
1abe0 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20  41, 42, 42, 43, 
1abf0 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34  43,./* 100 */  4
1ac00 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34  4, 44, 45, 45, 4
1ac10 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34  6, 46, 47, 47, 4
1ac20 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f  8, 48,./* 110 */
1ac30 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30    49, 49, 50, 50
1ac40 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32  , 51, 51, 52, 52
1ac50 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30  , 53, 53,./* 120
1ac60 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c   */  54, 54, 55,
1ac70 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c   55, 56, 56, 57,
1ac80 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   57.};../*.** Re
1ac90 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
1aca0 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
1acb0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
1acc0 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
1acd0 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
1ace0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1acf0 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
1ad00 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
1ad10 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20  erial_type>=128 
1ad20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
1ad30 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
1ad40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1ad50 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
1ad60 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20  pe<12 .         
1ad70 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61     || sqlite3Sma
1ad80 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1ad90 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61  al_type]==(seria
1ada0 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29  l_type - 12)/2 )
1adb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
1adc0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
1add0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
1ade0 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65  .  }.}.u8 sqlite
1adf0 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69  3VdbeOneByteSeri
1ae00 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72  alTypeLen(u8 ser
1ae10 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73  ial_type){.  ass
1ae20 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
1ae30 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e  <128 );.  return
1ae40 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1ae50 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1ae60 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pe];  .}../*.** 
1ae70 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
1ae80 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
1ae90 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
1aea0 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
1aeb0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
1aec0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
1aed0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
1aee0 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
1aef0 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
1af00 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
1af10 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
1af20 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
1af30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
1af40 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
1af50 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
1af60 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
1af70 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
1af80 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
1af90 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
1afa0 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
1afb0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
1afc0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
1afd0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
1afe0 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
1aff0 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
1b000 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
1b010 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
1b020 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
1b030 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
1b040 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
1b050 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
1b060 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
1b070 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
1b080 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
1b090 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
1b0a0 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
1b0b0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
1b0c0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
1b0d0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
1b0e0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
1b0f0 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
1b100 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
1b110 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
1b120 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
1b130 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
1b140 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
1b150 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
1b160 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
1b170 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
1b180 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
1b190 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
1b1a0 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
1b1b0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
1b1c0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
1b1d0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1b1e0 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
1b1f0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1b200 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
1b210 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
1b220 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
1b230 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
1b240 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
1b250 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
1b260 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
1b270 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
1b280 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
1b290 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
1b2a0 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
1b2b0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
1b2c0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
1b2d0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
1b2e0 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
1b2f0 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
1b300 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
1b310 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
1b320 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
1b330 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
1b340 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
1b350 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
1b360 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
1b370 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
1b380 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
1b390 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
1b3a0 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
1b3b0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
1b3c0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
1b3d0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
1b3e0 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
1b3f0 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
1b400 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
1b410 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
1b420 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
1b430 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
1b440 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
1b450 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
1b460 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
1b470 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
1b480 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
1b490 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
1b4a0 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
1b4b0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
1b4c0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
1b4d0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
1b4e0 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
1b4f0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1b500 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
1b510 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
1b520 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
1b530 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
1b540 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
1b550 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
1b560 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
1b570 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
1b580 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
1b590 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
1b5a0 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
1b5b0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
1b5c0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
1b5d0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
1b5e0 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
1b5f0 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
1b600 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1b610 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
1b620 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
1b630 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
1b640 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
1b650 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
1b660 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
1b670 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1b680 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
1b690 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
1b6a0 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
1b6b0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b6c0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
1b6d0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
1b6e0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
1b6f0 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
1b700 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
1b710 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
1b720 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
1b730 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
1b740 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
1b750 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
1b760 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
1b770 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
1b780 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
1b790 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
1b7a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1b7b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1b7c0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
1b7d0 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
1b7e0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
1b7f0 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
1b800 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
1b810 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
1b820 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
1b830 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
1b840 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
1b850 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
1b860 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b870 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
1b880 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
1b890 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
1b8a0 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
1b8b0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
1b8c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b8d0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
1b8e0 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
1b8f0 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
1b900 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b910 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
1b920 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
1b930 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
1b940 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
1b950 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
1b960 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
1b970 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
1b980 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
1b990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
1b9a0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
1b9b0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
1b9c0 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
1b9d0 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1b9e0 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ype];.    assert
1b9f0 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
1ba00 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
1ba10 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
1ba20 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
1ba30 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
1ba40 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
1ba50 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
1ba60 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
1ba70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1ba80 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
1ba90 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
1baa0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
1bab0 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
1bac0 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
1bad0 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
1bae0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1baf0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1bb00 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
1bb10 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c  em->n;.    if( l
1bb20 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75  en>0 ) memcpy(bu
1bb30 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
1bb40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
1bb50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
1bb60 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
1bb70 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
1bb80 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20   0;.}../* Input 
1bb90 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  "x" is a sequenc
1bba0 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68  e of unsigned ch
1bbb0 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65  aracters that re
1bbc0 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67  present a.** big
1bbd0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
1bbe0 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75    Return the equ
1bbf0 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69  ivalent native i
1bc00 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  nteger.*/.#defin
1bc10 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78  e ONE_BYTE_INT(x
1bc20 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d  )    ((i8)(x)[0]
1bc30 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59  ).#define TWO_BY
1bc40 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35  TE_INT(x)    (25
1bc50 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
1bc60 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[1]).#define T
1bc70 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29  HREE_BYTE_INT(x)
1bc80 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78    (65536*(i8)((x
1bc90 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38  )[0])|((x)[1]<<8
1bca0 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e  )|(x)[2]).#defin
1bcb0 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  e FOUR_BYTE_UINT
1bcc0 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b  (x)  (((u32)(x)[
1bcd0 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c  0]<<24)|((x)[1]<
1bce0 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1bcf0 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65  |(x)[3]).#define
1bd00 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78   FOUR_BYTE_INT(x
1bd10 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29  ) (16777216*(i8)
1bd20 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
1bd30 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
1bd40 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a  )|(x)[3])../*.**
1bd50 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
1bd60 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
1bd70 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
1bd80 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
1bd90 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
1bda0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
1bdb0 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
1bdc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1bdd0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ytes read..**.**
1bde0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bdf0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1be00 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f   two separate ro
1be10 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f  utines for perfo
1be20 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66  rmance..** The f
1be30 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65  ew cases that re
1be40 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69  quire local vari
1be50 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e  ables are broken
1be60 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61   out into a sepa
1be70 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rate.** routine 
1be80 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20  so that in most 
1be90 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65  cases the overhe
1bea0 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65  ad of moving the
1beb0 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a   stack pointer.*
1bec0 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f  * is avoided..*/
1bed0 20 0a 73 74 61 74 69 63 20 75 33 32 20 73 65 72   .static u32 ser
1bee0 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
1bef0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
1bf00 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
1bf10 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
1bf20 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
1bf30 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
1bf40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
1bf50 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
1bf60 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
1bf70 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
1bf80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
1bf90 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
1bfa0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
1bfb0 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55  ){.  u64 x = FOU
1bfc0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
1bfd0 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52  ;.  u32 y = FOUR
1bfe0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
1bff0 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29  );.  x = (x<<32)
1c000 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69   + y;.  if( seri
1c010 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
1c020 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1c030 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20  : R-29851-52272 
1c040 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1c050 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20  ndian 64-bit.   
1c060 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1c070 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1c080 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1c090 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
1c0a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1c0b0 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
1c0c0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1c0d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c0e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c0f0 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61  R-57343-49114 Va
1c100 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1c110 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30  ian IEEE 754-200
1c120 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  8 64-bit.    ** 
1c130 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
1c140 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64  umber. */.#if !d
1c150 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
1c160 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1c170 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1c180 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65  POINT).    /* Ve
1c190 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
1c1a0 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
1c1b0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
1c1c0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
1c1d0 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
1c1e0 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
1c1f0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
1c200 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
1c210 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
1c220 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1c230 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
1c240 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
1c250 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
1c260 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
1c270 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
1c280 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
1c290 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63  <<32;.    static
1c2a0 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
1c2b0 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20   = 1.0;.    u64 
1c2c0 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61  t2 = t1;.    swa
1c2d0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1c2e0 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72  t(t2);.    asser
1c2f0 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
1c300 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
1c310 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
1c320 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
1c330 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
1c340 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
1c350 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
1c360 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  u.r)==8 );.    s
1c370 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1c380 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
1c390 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26  py(&pMem->u.r, &
1c3a0 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
1c3b0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1c3c0 20 49 73 4e 61 4e 28 78 29 20 3f 20 4d 45 4d 5f   IsNaN(x) ? MEM_
1c3d0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
1c3e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
1c3f0 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
1c400 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
1c410 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c420 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
1c430 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
1c440 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
1c450 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c470 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
1c480 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
1c490 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4b0 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
1c4c0 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
1c4d0 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
1c4e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1c4f0 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20  .    case 10: { 
1c500 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20  /* Internal use 
1c510 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20  only: NULL with 
1c520 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20  virtual table.  
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1c540 55 50 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65  UPDATE no-change
1c550 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20   flag set */.   
1c560 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1c570 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65   MEM_Null|MEM_Ze
1c580 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ro;.      pMem->
1c590 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65  n = 0;.      pMe
1c5a0 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a  m->u.nZero = 0;.
1c5b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c5c0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20   }.    case 11: 
1c5d0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
1c5e0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
1c5f0 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
1c600 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  * Null */.      
1c610 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c620 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61  R-24078-09375 Va
1c630 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a  lue is a NULL. *
1c640 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
1c650 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
1c660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c670 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
1c680 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1c690 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32  CE-OF: R-44885-2
1c6a0 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e  5196 Value is an
1c6b0 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70   8-bit twos-comp
1c6c0 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  lement.      ** 
1c6d0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1c6e0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
1c6f0 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
1c700 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c710 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1c720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1c730 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1c740 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1c750 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
1c760 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
1c770 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c780 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c790 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36  F: R-49794-35026
1c7a0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1c7b0 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20  endian 16-bit.  
1c7c0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1c7d0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1c7e0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1c7f0 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
1c800 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1c810 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1c820 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1c830 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1c840 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1c850 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
1c860 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1c870 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c880 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1c890 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33  DENCE-OF: R-3783
1c8a0 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73  9-54301 Value is
1c8b0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34   a big-endian 24
1c8c0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1c8d0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1c8e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1c8f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45  pMem->u.i = THRE
1c900 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
1c910 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c920 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1c930 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1c940 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1c950 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
1c960 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1c970 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1c980 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c990 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c9a0 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39  F: R-01849-26079
1c9b0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1c9c0 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20  endian 32-bit.  
1c9d0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1c9e0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1c9f0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1ca00 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49  .i = FOUR_BYTE_I
1ca10 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20  NT(buf);.#ifdef 
1ca20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f  __HP_cc .      /
1ca30 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  * Work around a 
1ca40 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62  sign-extension b
1ca50 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d  ug in the HP com
1ca60 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20  piler for HP/UX 
1ca70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66  */.      if( buf
1ca80 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d  [0]&0x80 ) pMem-
1ca90 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66  >u.i |= 0xffffff
1caa0 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65  ff80000000LL;.#e
1cab0 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ndif.      pMem-
1cac0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1cad0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cae0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1caf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
1cb00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1cb10 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
1cb20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1cb30 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1cb40 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
1cb50 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
1cb60 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
1cb70 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1cb80 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1cb90 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1cba0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1cbb0 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
1cbc0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1cbd0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
1cbe0 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1cbf0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1cc00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cc10 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1cc20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
1cc30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1cc40 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
1cc50 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1cc60 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
1cc70 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
1cc80 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
1cc90 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
1cca0 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
1ccb0 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
1ccc0 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
1ccd0 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
1cce0 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
1ccf0 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
1cd00 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1cd10 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1cd20 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
1cd30 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
1cd40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1cd50 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
1cd60 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
1cd70 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
1cd80 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
1cd90 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1cda0 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
1cdb0 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1cdc0 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
1cdd0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
1cde0 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
1cdf0 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
1ce00 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1ce10 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
1ce20 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
1ce30 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1ce40 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
1ce50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
1ce60 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
1ce70 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1ce80 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
1ce90 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
1cea0 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
1ceb0 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
1cec0 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
1ced0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1cee0 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
1cef0 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
1cf00 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
1cf10 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
1cf20 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
1cf30 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
1cf40 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1cf50 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
1cf60 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
1cf70 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
1cf80 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
1cf90 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
1cfa0 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
1cfb0 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
1cfc0 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
1cfd0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
1cfe0 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
1cff0 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
1d000 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
1d010 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1d020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1d030 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
1d040 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
1d050 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
1d060 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
1d070 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
1d080 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
1d090 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1d0a0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1d0b0 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
1d0c0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1d0d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
1d0e0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
1d0f0 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
1d100 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
1d110 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
1d120 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
1d130 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
1d140 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
1d150 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
1d160 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
1d170 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
1d180 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
1d190 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
1d1a0 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
1d1b0 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
1d1c0 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
1d1d0 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
1d1e0 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
1d1f0 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
1d200 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1d210 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
1d220 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
1d230 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
1d240 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
1d250 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
1d260 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
1d270 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
1d280 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
1d290 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
1d2a0 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
1d2b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
1d2c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
1d2d0 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
1d2e0 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
1d2f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d310 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1d320 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  the record */.){
1d330 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1d340 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
1d350 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
1d360 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
1d370 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d3a0 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
1d3b0 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79   for *p */.  nBy
1d3c0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
1d3d0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1d3e0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1d3f0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  )*(pKeyInfo->nKe
1d400 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d  yField+1);.  p =
1d410 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1d420 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1d430 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1d440 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
1d450 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1d460 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
1d470 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
1d480 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1d490 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
1d4a0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1d4b0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1d4c0 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
1d4d0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1d4e0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
1d4f0 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1d500 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
1d510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1d520 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
1d530 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
1d540 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
1d550 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
1d560 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
1d570 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1d580 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
1d590 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
1d5a0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1d5b0 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
1d5c0 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
1d5d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d5e0 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
1d5f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1d600 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1d610 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
1d620 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
1d630 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
1d640 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1d650 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1d660 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1d670 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1d680 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
1d690 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1d6a0 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
1d6b0 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
1d6c0 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
1d6d0 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
1d6e0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1d6f0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1d700 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1d710 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 75 33  har *)pKey;.  u3
1d720 32 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  2 d; .  u32 idx;
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1d750 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
1d760 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
1d770 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d790 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1d7a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
1d7b0 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
1d7c0 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
1d7d0 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
1d7e0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
1d7f0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1d800 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
1d810 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1d820 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1d830 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
1d840 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
1d850 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 28 75 33  <szHdr && d<=(u3
1d860 32 29 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  2)nKey ){.    u3
1d870 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
1d880 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1d890 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
1d8a0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1d8b0 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
1d8c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1d8d0 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
1d8e0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
1d8f0 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20   /* pMem->flags 
1d900 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56  = 0; // sqlite3V
1d910 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77  dbeSerialGet() w
1d920 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72  ill set this for
1d930 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   us */.    pMem-
1d940 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
1d950 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a     pMem->z = 0;.
1d960 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
1d970 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1d980 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
1d990 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
1d9a0 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  pMem++;.    if( 
1d9b0 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64  (++u)>=p->nField
1d9c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1d9d0 69 66 28 20 64 3e 28 75 33 32 29 6e 4b 65 79 20  if( d>(u32)nKey 
1d9e0 26 26 20 75 20 29 7b 0a 20 20 20 20 61 73 73 65  && u ){.    asse
1d9f0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  rt( CORRUPT_DB )
1da00 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 61 20 63 6f  ;.    /* In a co
1da10 72 72 75 70 74 20 72 65 63 6f 72 64 20 65 6e 74  rrupt record ent
1da20 72 79 2c 20 74 68 65 20 6c 61 73 74 20 70 4d 65  ry, the last pMe
1da30 6d 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  m might have bee
1da40 6e 20 73 65 74 20 75 70 20 75 73 69 6e 67 20 0a  n set up using .
1da50 20 20 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c      ** uninitial
1da60 69 7a 65 64 20 6d 65 6d 6f 72 79 2e 20 4f 76 65  ized memory. Ove
1da70 72 77 72 69 74 65 20 69 74 73 20 76 61 6c 75 65  rwrite its value
1da80 20 77 69 74 68 20 4e 55 4c 4c 2c 20 74 6f 20 70   with NULL, to p
1da90 72 65 76 65 6e 74 0a 20 20 20 20 2a 2a 20 77 61  revent.    ** wa
1daa0 72 6e 69 6e 67 73 20 66 72 6f 6d 20 4d 53 41 4e  rnings from MSAN
1dab0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1dac0 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
1dad0 4d 65 6d 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73  Mem-1);.  }.  as
1dae0 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
1daf0 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31  o->nKeyField + 1
1db00 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1db10 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = u;.}..#ifdef S
1db20 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1db30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1db40 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1db50 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1db60 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1db70 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1db80 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1db90 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1dba0 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1dbb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1dbc0 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1dbd0 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1dbe0 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1dbf0 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1dc00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1dc10 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1dc20 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1dc30 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1dc40 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1dc50 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1dc60 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1dc70 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1dc80 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1dc90 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1dca0 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1dcb0 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1dcc0 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1dcd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1dce0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1dcf0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1dd00 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1dd10 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1dd20 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1dd30 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1dd40 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1dd50 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1dd60 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1dd70 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1dd80 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1dd90 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1dda0 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1ddb0 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1ddc0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1ddd0 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ddf0 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1de00 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1de10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1de20 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1de30 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1de40 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1de50 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1de60 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1de70 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1de80 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1de90 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1dea0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1deb0 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1dec0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1ded0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1dee0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1def0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1df00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1df10 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1df20 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1df30 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1df40 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1df50 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1df60 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1df70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1df80 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1df90 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1dfa0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1dfb0 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1dfc0 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1dfd0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1dfe0 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1dff0 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1e000 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1e010 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1e020 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1e030 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e040 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1e050 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1e060 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1e070 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1e080 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1e090 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1e0a0 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1e0b0 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1e0c0 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1e0d0 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1e0e0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1e0f0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1e100 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1e110 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1e120 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1e130 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1e140 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1e150 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1e160 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1e170 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1e180 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1e190 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1e1a0 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1e1b0 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1e1c0 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1e1d0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1e1e0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1e1f0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1e200 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1e210 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1e220 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1e230 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1e240 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1e250 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1e260 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1e270 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1e280 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1e290 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1e2a0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1e2b0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1e2c0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  rt( pKeyInfo->nA
1e2d0 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  llField>=pPKey2-
1e2e0 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1e2f0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1e300 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1e310 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1e320 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1e330 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b  ->nKeyField>0 );
1e340 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1e350 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1e360 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1e370 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1e380 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
1e390 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
1e3a0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
1e3b0 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
1e3c0 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
1e3d0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1e3e0 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
1e3f0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
1e400 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1e410 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
1e420 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
1e430 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
1e440 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
1e450 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
1e460 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
1e470 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
1e480 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
1e490 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
1e4a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1e4b0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
1e4c0 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
1e4d0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
1e4e0 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
1e4f0 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
1e500 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
1e510 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
1e520 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1e530 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
1e540 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
1e550 20 20 20 69 66 28 20 64 31 2b 28 75 36 34 29 73     if( d1+(u64)s
1e560 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75  erial_type1+2>(u
1e570 36 34 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26  64)nKey1.     &&
1e580 20 64 31 2b 28 75 36 34 29 73 71 6c 69 74 65 33   d1+(u64)sqlite3
1e590 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1e5a0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
1e5b0 28 75 36 34 29 6e 4b 65 79 31 20 0a 20 20 20 20  (u64)nKey1 .    
1e5c0 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1e5d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
1e5e0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
1e5f0 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
1e600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
1e610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1e620 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1e630 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
1e640 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
1e650 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
1e660 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
1e670 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
1e680 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
1e690 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20  ey2->aMem[i],.  
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
1e6c0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 69 20 3f  o->nAllField>i ?
1e6d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1e6e0 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
1e6f0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1e700 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1e710 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1e720 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1e730 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
1e740 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1e750 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1e760 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
1e770 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
1e780 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
1e790 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
1e7a0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
1e7b0 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
1e7c0 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
1e7d0 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
1e7e0 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1e7f0 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
1e800 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1e810 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1e820 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1e830 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1e840 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1e850 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1e860 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1e870 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1e880 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1e890 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1e8a0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1e8b0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1e8c0 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
1e8d0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1e8e0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1e8f0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1e900 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
1e910 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1e920 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1e930 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1e940 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1e950 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1e960 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1e970 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1e980 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
1e990 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
1e9a0 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
1e9b0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1e9c0 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
1e9d0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1e9e0 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
1e9f0 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
1ea00 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1ea10 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
1ea20 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1ea30 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1ea40 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1ea50 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1ea60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1ea70 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1ea80 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1ea90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1eaa0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1eab0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1eac0 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1ead0 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1eae0 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1eaf0 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1eb00 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1eb10 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1eb20 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1eb30 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1eb40 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c  by pKeyInfo->nAl
1eb50 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  lField..**.** If
1eb60 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1eb70 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
1eb80 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  d, it means that
1eb90 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a   the high-speed.
1eba0 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  ** vdbeRecordCom
1ebb0 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64  pareInt() and vd
1ebc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1ebd0 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73  tring() routines
1ebe0 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
1ebf0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66  k correctly.  If
1ec00 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65   this assert() e
1ec10 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72  ver fires, it pr
1ec20 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20  obably means.** 
1ec30 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f  that the KeyInfo
1ec40 2e 6e 4b 65 79 46 69 65 6c 64 20 6f 72 20 4b 65  .nKeyField or Ke
1ec50 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20  yInfo.nAllField 
1ec60 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70  values were comp
1ec70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63  uted.** incorrec
1ec80 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tly..*/.static v
1ec90 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69  oid vdbeAssertFi
1eca0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1ecb0 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79  mits(.  int nKey
1ecc0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1ecd0 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ey,   /* The rec
1ece0 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f  ord to verify */
1ecf0 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66   .  const KeyInf
1ed00 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20  o *pKeyInfo     
1ed10 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a    /* Compare siz
1ed20 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49  e with this KeyI
1ed30 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nfo */.){.  int 
1ed40 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33  nField = 0;.  u3
1ed50 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69  2 szHdr;.  u32 i
1ed60 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65  dx;.  u32 notUse
1ed70 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  d;.  const unsig
1ed80 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1ed90 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1eda0 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20   char*)pKey;..  
1edb0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1edc0 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d   return;.  idx =
1edd0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1ede0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73  y, szHdr);.  ass
1edf0 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  ert( nKey>=0 );.
1ee00 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c    assert( szHdr<
1ee10 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20  =(u32)nKey );.  
1ee20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1ee30 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67   ){.    idx += g
1ee40 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b  etVarint32(aKey+
1ee50 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20  idx, notUsed);. 
1ee60 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d     nField++;.  }
1ee70 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c  .  assert( nFiel
1ee80 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  d <= pKeyInfo->n
1ee90 41 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  AllField );.}.#e
1eea0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1eeb0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1eec0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1eed0 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1eee0 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1eef0 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1ef00 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1ef10 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1ef20 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1ef30 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1ef40 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1ef50 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1ef60 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1ef70 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1ef80 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1ef90 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1efa0 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1efb0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1efc0 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1efd0 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1efe0 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1eff0 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1f000 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1f010 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1f020 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1f030 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1f040 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1f050 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1f060 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1f070 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1f080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1f090 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1f0a0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1f0b0 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1f0c0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1f0d0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1f0e0 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1f0f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1f100 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1f110 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1f120 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1f130 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1f140 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1f150 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1f160 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1f170 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1f180 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1f190 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1f1a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1f1b0 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d   *v1, *v2;.    M
1f1c0 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1f1d0 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1f1e0 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1f1f0 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1f200 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1f210 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1f220 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1f230 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1f240 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1f250 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1f260 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1f270 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1f280 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1f290 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1f2a0 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1f2b0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1f2c0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1f2d0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1f2e0 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
1f2f0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1f300 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
1f310 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69  oll->enc);.    i
1f320 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1f330 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =0) ){.      if(
1f340 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1f350 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1f360 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20  _BKPT;.      rc 
1f370 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f380 20 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c        rc = pColl
1f390 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1f3a0 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63  ser, c1.n, v1, c
1f3b0 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a  2.n, v2);.    }.
1f3c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1f3d0 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
1f3e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1f3f0 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
1f400 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f410 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
1f420 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73 20 67  input pBlob is g
1f430 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1f440 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73 20 6e  a Blob that is n
1f450 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74  ot marked.** wit
1f460 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74  h MEM_Zero.  Ret
1f470 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
1f480 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f 2d 62  ould be a zero-b
1f490 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lob..*/.static i
1f4a0 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e  nt isAllZero(con
1f4b0 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
1f4c0 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  n){.  int i;.  f
1f4d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
1f4e0 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20  ){.    if( z[i] 
1f4f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1f500 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1f510 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1f520 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1f530 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1f540 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1f550 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1f560 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1f570 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1f580 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1f590 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1f5a0 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1f5b0 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1f5c0 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1f5d0 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1f5e0 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45  essor..*/.SQLITE
1f5f0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1f600 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1f610 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1f620 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1f630 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
1f640 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20   n1 = pB1->n;.  
1f650 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b  int n2 = pB2->n;
1f660 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73  ..  /* It is pos
1f670 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20  sible to have a 
1f680 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20  Blob value that 
1f690 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72  has some non-zer
1f6a0 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66  o content.  ** f
1f6b0 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20  ollowed by zero 
1f6c0 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68  content.  But th
1f6d0 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70  at only comes up
1f6e0 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65   for Blobs forme
1f6f0 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50  d.  ** by the OP
1f700 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1f710 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f  de, and such Blo
1f720 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73  bs never get pas
1f730 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
1f740 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1f750 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
1f760 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB1->flags & ME
1f770 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31  M_Zero)==0 || n1
1f780 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1f790 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB2->flags & M
1f7a0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1f7b0 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  2==0 );..  if( (
1f7c0 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e  pB1->flags|pB2->
1f7d0 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72  flags) & MEM_Zer
1f7e0 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31  o ){.    if( pB1
1f7f0 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66  ->flags & pB2->f
1f800 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1f810 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f820 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70  pB1->u.nZero - p
1f830 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  B2->u.nZero;.   
1f840 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e   }else if( pB1->
1f850 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1f860 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
1f870 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c  sAllZero(pB2->z,
1f880 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB2->n) ) retur
1f890 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n -1;.      retu
1f8a0 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1f8b0 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  - n2;.    }else{
1f8c0 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1f8d0 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42  lZero(pB1->z, pB
1f8e0 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b  1->n) ) return +
1f8f0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f900 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72  n1 - pB2->u.nZer
1f910 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63  o;.    }.  }.  c
1f920 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1f930 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20  , pB2->z, n1>n2 
1f940 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66  ? n2 : n1);.  if
1f950 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1f960 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32    return n1 - n2
1f970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
1f980 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65  comparison betwe
1f990 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e  en a 64-bit sign
1f9a0 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61  ed integer and a
1f9b0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
1f9c0 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72  -point.** number
1f9d0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1f9e0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1f9f0 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1fa00 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73  st (i64) is less
1fa10 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20   than,.** equal 
1fa20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1fa30 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28  han the second (
1fa40 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  double)..*/.stat
1fa50 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  ic int sqlite3In
1fa60 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36  tFloatCompare(i6
1fa70 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a  4 i, double r){.
1fa80 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e    if( sizeof(LON
1fa90 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20  GDOUBLE_TYPE)>8 
1faa0 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c  ){.    LONGDOUBL
1fab0 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47  E_TYPE x = (LONG
1fac0 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20  DOUBLE_TYPE)i;. 
1fad0 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74     if( x<r ) ret
1fae0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1faf0 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  x>r ) return +1;
1fb00 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1fb10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1fb20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b  y;.    double s;
1fb30 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33  .    if( r<-9223
1fb40 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e  372036854775808.
1fb50 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  0 ) return +1;. 
1fb60 20 20 20 69 66 28 20 72 3e 3d 39 32 32 33 33 37     if( r>=922337
1fb70 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1fb80 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1fb90 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20   y = (i64)r;.   
1fba0 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72   if( i<y ) retur
1fbb0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e  n -1;.    if( i>
1fbc0 79 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  y ) return +1;. 
1fbd0 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69     s = (double)i
1fbe0 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20  ;.    if( s<r ) 
1fbf0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1fc00 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20  f( s>r ) return 
1fc10 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1fc20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1fc30 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
1fc40 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
1fc50 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
1fc60 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
1fc70 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
1fc80 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1fc90 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1fca0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1fcb0 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
1fcc0 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
1fcd0 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
1fce0 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
1fcf0 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
1fd00 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
1fd10 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
1fd20 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
1fd30 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
1fd40 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
1fd50 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
1fd60 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
1fd70 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
1fd80 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
1fd90 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
1fda0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1fdb0 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
1fdc0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1fdd0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1fde0 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
1fdf0 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
1fe00 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
1fe10 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
1fe20 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
1fe30 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
1fe40 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
1fe50 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
1fe60 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
1fe70 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
1fe80 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 21  |f2;.  assert( !
1fe90 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73  sqlite3VdbeMemIs
1fea0 52 6f 77 53 65 74 28 70 4d 65 6d 31 29 20 26 26  RowSet(pMem1) &&
1feb0 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d   !sqlite3VdbeMem
1fec0 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 32 29 20  IsRowSet(pMem2) 
1fed0 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
1fee0 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
1fef0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1ff00 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
1ff10 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
1ff20 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
1ff30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
1ff40 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1ff50 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
1ff60 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
1ff70 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
1ff80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
1ff90 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
1ffa0 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61   two values is a
1ffb0 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69   number.  */.  i
1ffc0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1ffd0 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1ffe0 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29  eal|MEM_IntReal)
1fff0 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
20000 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
20010 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
20020 20 20 74 65 73 74 63 61 73 65 28 20 63 6f 6d 62    testcase( comb
20030 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
20040 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
20050 74 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f  tcase( combined_
20060 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52  flags & MEM_IntR
20070 65 61 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  eal );.    if( (
20080 66 31 20 26 20 66 32 20 26 20 28 4d 45 4d 5f 49  f1 & f2 & (MEM_I
20090 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29  nt|MEM_IntReal))
200a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  !=0 ){.      tes
200b0 74 63 61 73 65 28 20 66 31 20 26 20 66 32 20 26  tcase( f1 & f2 &
200c0 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
200d0 20 20 74 65 73 74 63 61 73 65 28 20 66 31 20 26    testcase( f1 &
200e0 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61   f2 & MEM_IntRea
200f0 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  l );.      if( p
20100 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
20110 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
20120 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
20130 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
20140 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b  ->u.i ) return +
20150 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
20160 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
20170 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
20180 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
20190 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
201a0 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   < pMem2->u.r ) 
201b0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
201c0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
201d0 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  > pMem2->u.r ) r
201e0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
201f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
20200 20 20 20 20 69 66 28 20 28 66 31 26 28 4d 45 4d      if( (f1&(MEM
20210 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
20220 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  ))!=0 ){.      t
20230 65 73 74 63 61 73 65 28 20 66 31 20 26 20 4d 45  estcase( f1 & ME
20240 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74  M_Int );.      t
20250 65 73 74 63 61 73 65 28 20 66 31 20 26 20 4d 45  estcase( f1 & ME
20260 4d 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20  M_IntReal );.   
20270 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52     if( (f2&MEM_R
20280 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
20290 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
202a0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
202b0 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem1->u.i, pMe
202c0 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m2->u.r);.      
202d0 7d 65 6c 73 65 20 69 66 28 20 28 66 32 26 28 4d  }else if( (f2&(M
202e0 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65  EM_Int|MEM_IntRe
202f0 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  al))!=0 ){.     
20300 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
20310 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
20320 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
20330 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
20340 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i > pMem2->u.i 
20350 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
20360 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
20370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20380 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
20390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
203a0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
203b0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
203c0 66 28 20 28 66 32 26 28 4d 45 4d 5f 49 6e 74 7c  f( (f2&(MEM_Int|
203d0 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30  MEM_IntReal))!=0
203e0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
203f0 63 61 73 65 28 20 66 32 20 26 20 4d 45 4d 5f 49  case( f2 & MEM_I
20400 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  nt );.        te
20410 73 74 63 61 73 65 28 20 66 32 20 26 20 4d 45 4d  stcase( f2 & MEM
20420 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20  _IntReal );.    
20430 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69      return -sqli
20440 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
20450 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70  re(pMem2->u.i, p
20460 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem1->u.r);.    
20470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20480 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
20490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
204a0 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20  turn +1;.  }..  
204b0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
204c0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
204d0 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
204e0 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
204f0 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
20500 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
20510 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
20520 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
20530 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
20540 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
20550 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
20560 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
20570 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
20580 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
20590 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
205a0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
205b0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
205c0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
205d0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
205e0 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65  Mem2->enc || pMe
205f0 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  m1->db->mallocFa
20600 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65  iled );.    asse
20610 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
20620 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a  SQLITE_UTF8 || .
20630 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
20640 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
20650 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d  TF16LE || pMem1-
20660 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
20670 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  16BE );..    /* 
20680 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
20690 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64  quence must be d
206a0 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70  efined at this p
206b0 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20  oint, even if.  
206c0 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65    ** the user de
206d0 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  letes the collat
206e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74  ion sequence aft
206f0 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  er the vdbe prog
20700 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ram is.    ** co
20710 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73  mpiled (this was
20720 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20   not always the 
20730 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  case)..    */.  
20740 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c    assert( !pColl
20750 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   || pColl->xCmp 
20760 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  );..    if( pCol
20770 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
20780 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  n vdbeCompareMem
20790 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d  String(pMem1, pM
207a0 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a  em2, pColl, 0);.
207b0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
207c0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77  a NULL pointer w
207d0 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  as passed as the
207e0 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f   collate functio
207f0 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  n, fall through.
20800 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c      ** to the bl
20810 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20  ob case and use 
20820 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
20830 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61  }. .  /* Both va
20840 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f  lues must be blo
20850 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69  bs.  Compare usi
20860 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  ng memcmp().  */
20870 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20880 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65  3BlobCompare(pMe
20890 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a  m1, pMem2);.}...
208a0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
208b0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
208c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
208d0 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
208e0 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
208f0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
20900 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
20910 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
20920 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
20930 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
20940 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
20950 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
20960 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
20970 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
20980 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
20990 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
209a0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
209b0 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
209c0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
209d0 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
209e0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
209f0 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
20a00 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
20a10 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
20a20 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
20a30 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
20a40 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
20a50 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
20a60 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
20a70 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
20a80 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
20a90 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
20aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
20ab0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
20ac0 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
20ad0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20ae0 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
20af0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
20b00 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
20b10 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
20b20 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20b30 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
20b40 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
20b50 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
20b60 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
20b70 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
20b80 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
20b90 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
20ba0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
20bb0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
20bc0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
20bd0 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
20be0 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
20bf0 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
20c00 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
20c10 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
20c20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
20c30 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
20c40 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
20c50 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
20c60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
20c70 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
20c80 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
20c90 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
20ca0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
20cb0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
20cc0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
20cd0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20ce0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
20cf0 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
20d00 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
20d10 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
20d20 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
20d30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20d40 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
20d50 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
20d60 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
20d70 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
20d80 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
20d90 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
20da0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
20db0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
20dc0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
20dd0 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
20de0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
20df0 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
20e00 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
20e10 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
20e20 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
20e30 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
20e40 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
20e50 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
20e60 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
20e70 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
20e80 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
20e90 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
20ea0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
20eb0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
20ec0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
20ed0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
20ee0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
20ef0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
20f00 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
20f10 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
20f20 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
20f30 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
20f40 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
20f50 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
20f60 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
20f70 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
20f80 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
20f90 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
20fa0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
20fb0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
20fc0 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
20fd0 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
20fe0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
20ff0 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
21000 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
21010 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
21020 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a  ->errCode to .**
21030 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
21040 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66  and return 0. If
21050 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
21060 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a   encountered, .*
21070 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  * pPKey2->errCod
21080 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
21090 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66  TE_NOMEM and, if
210a0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
210b0 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66   the.** malloc-f
210c0 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f  ailed flag set o
210d0 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
210e0 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  e (pPKey2->pKeyI
210f0 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74  nfo->db)..*/.int
21100 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
21110 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
21120 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  p(.  int nKey1, 
21130 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
21140 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
21150 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
21160 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20  cord *pPKey2,   
21170 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
21180 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
21190 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
211a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
211b0 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72  ue, skip the fir
211c0 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  st field */.){. 
211d0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211f0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
21200 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
21210 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
21220 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
21250 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61  t field to compa
21260 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  re */.  u32 szHd
21270 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
21280 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21290 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  of record header
212a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
212b0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212d0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
212e0 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72  t type in header
212f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   */.  int rc = 0
21300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21310 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21320 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  value */.  Mem *
21330 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61  pRhs = pPKey2->a
21340 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  Mem;       /* Ne
21350 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  xt field of pPKe
21360 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  y2 to compare */
21370 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
21380 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Info;.  const un
21390 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
213a0 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
213b0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
213c0 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  1;.  Mem mem1;..
213d0 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73    /* If bSkip is
213e0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
213f0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
21400 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  dy determined th
21410 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  at the first.  *
21420 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
21430 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  n the keys are e
21440 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61  qual. Fix the va
21450 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69  rious stack vari
21460 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68  ables so.  ** th
21470 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
21480 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67  begins comparing
21490 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66   at the second f
214a0 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62  ield. */.  if( b
214b0 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20  Skip ){.    u32 
214c0 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31  s1;.    idx1 = 1
214d0 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
214e0 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20  aKey1[1], s1);. 
214f0 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79     szHdr1 = aKey
21500 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73  1[0];.    d1 = s
21510 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56  zHdr1 + sqlite3V
21520 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
21530 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
21540 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
21550 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d  else{.    idx1 =
21560 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
21570 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20  y1, szHdr1);.   
21580 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
21590 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69    i = 0;.  }.  i
215a0 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
215b0 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 70 50  nKey1 ){ .    pP
215c0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
215d0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
215e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
215f0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
21600 70 74 69 6f 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20  ption */.  }..  
21610 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
21620 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
21630 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
21640 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
21650 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
21660 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
21670 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70  fo->nAllField>=p
21680 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20  PKey2->nField . 
21690 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
216a0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
216b0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
216c0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
216d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
216e0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
216f0 6e 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20  nKeyField>0 );. 
21700 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
21710 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
21720 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
21730 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
21740 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
21750 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
21760 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
21770 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
21780 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20  M_IntReal) ){.  
21790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
217a0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
217b0 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Int );.      tes
217c0 74 63 61 73 65 28 20 70 52 68 73 2d 3e 66 6c 61  tcase( pRhs->fla
217d0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  gs & MEM_IntReal
217e0 20 29 3b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   );.      serial
217f0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
21800 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
21810 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
21820 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
21830 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
21840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
21850 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
21860 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
21870 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21880 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
21890 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
218a0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
218b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
218c0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
218d0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
218e0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
218f0 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
21900 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
21910 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
21920 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
21930 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
21940 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
21950 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
21960 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
21970 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
21980 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
21990 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
219a0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
219b0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
219c0 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
219d0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
219e0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
219f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
21a00 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
21a10 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
21a20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
21a30 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
21a40 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
21a50 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
21a60 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
21a70 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
21a80 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
21a90 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
21aa0 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
21ab0 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
21ac0 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
21ad0 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
21ae0 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
21af0 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
21b00 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
21b10 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
21b20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
21b30 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
21b40 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
21b50 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
21b60 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
21b70 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
21b80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
21b90 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
21ba0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
21bb0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
21bc0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
21bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21be0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
21bf0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
21c00 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
21c10 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
21c20 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
21c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21c40 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
21c50 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
21c60 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
21c70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21c80 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
21c90 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
21ca0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
21cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
21ce0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
21cf0 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
21d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21d10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21d20 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
21d30 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
21d40 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21d50 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
21d60 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
21d70 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
21d80 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
21d90 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
21da0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
21db0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
21dc0 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
21dd0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
21de0 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
21df0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
21e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
21e10 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
21e20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
21e30 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
21e40 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
21e50 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
21e60 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
21e70 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
21e80 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
21e90 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
21ea0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
21eb0 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
21ec0 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
21ed0 65 64 29 6e 4b 65 79 31 0a 20 20 20 20 20 20 20  ed)nKey1.       
21ee0 20 20 7c 7c 20 28 70 4b 65 79 49 6e 66 6f 20 3d    || (pKeyInfo =
21ef0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
21f00 6f 29 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 69  o)->nAllField<=i
21f10 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
21f20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
21f30 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
21f40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
21f50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21f60 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21f70 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
21f80 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
21f90 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
21fa0 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
21fb0 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
21fc0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
21fd0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
21fe0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
21ff0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
22000 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
22010 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
22020 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
22030 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
22040 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
22050 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
22060 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
22070 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
22080 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
22090 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
220a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
220b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
220c0 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
220d0 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
220e0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
220f0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
22100 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
22110 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
22120 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
22130 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
22140 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
22150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
22160 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
22170 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
22180 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
22190 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
221a0 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73     assert( (pRhs
221b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
221c0 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  ro)==0 || pRhs->
221d0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65  n==0 );.      ge
221e0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
221f0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
22200 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
22210 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
22220 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
22230 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
22240 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
22250 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
22260 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
22270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22280 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
22290 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
222a0 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
222b0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
222c0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
222d0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
222e0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
222f0 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
22300 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
22310 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
22320 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
22330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
22340 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
22350 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
22360 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
22370 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
22380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
22390 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
223a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
223b0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
223c0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
223d0 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
223e0 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61  ((const char*)&a
223f0 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29  Key1[d1],nStr) )
22400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
22410 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
22420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22430 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70     rc = nStr - p
22440 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rhs->u.nZero;.  
22450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22470 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
22480 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
22490 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
224a0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
224b0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
224c0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
224d0 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
224e0 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
224f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
22510 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
22520 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
22530 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
22540 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
22550 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
22560 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
22570 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
22580 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
22590 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
225a0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
225b0 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
225c0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
225d0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
225e0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
225f0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
22600 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
22610 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
22620 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
22630 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
22640 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
22650 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
22660 2b 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 50  +;.    if( i==pP
22670 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62  Key2->nField ) b
22680 72 65 61 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b  reak;.    pRhs++
22690 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
226a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
226b0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
226c0 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
226d0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
226e0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
226f0 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
22700 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
22710 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
22720 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
22730 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
22740 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
22750 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
22760 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
22770 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
22780 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
22790 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
227a0 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
227b0 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
227c0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
227d0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
227e0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
227f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
22800 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
22810 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
22820 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
22830 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
22840 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
22850 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
22860 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
22870 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
22880 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
22890 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
228a0 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
228b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
228c0 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
228d0 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
228e0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
228f0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
22900 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
22910 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
22920 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
22930 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
22940 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32  ed.  );.  pPKey2
22950 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
22960 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
22970 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
22980 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22990 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
229a0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
229b0 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
229c0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
229d0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
229e0 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
229f0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
22a00 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
22a10 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22a20 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
22a30 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
22a40 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
22a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22a60 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
22a70 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
22a80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22a90 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
22aa0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
22ab0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
22ac0 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
22ad0 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
22ae0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
22af0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
22b00 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
22b10 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
22b20 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
22b30 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
22b40 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
22b50 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
22b60 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
22b70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
22b80 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
22b90 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
22ba0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
22bb0 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
22bc0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
22bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
22be0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
22bf0 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
22c00 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
22c10 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
22c20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
22c30 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
22c40 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
22c50 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
22c60 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
22c70 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
22c80 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
22c90 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
22ca0 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
22cb0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
22cc0 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
22cd0 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
22ce0 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c    i64 v;.  i64 l
22cf0 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
22d00 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
22d10 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
22d20 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
22d30 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
22d40 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
22d50 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
22d60 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
22d70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
22d80 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
22d90 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
22da0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
22db0 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
22dc0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
22dd0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
22de0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
22df0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22e00 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
22e10 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
22e20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
22e30 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
22e40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22e50 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
22e60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22e70 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
22e80 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
22e90 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
22ea0 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
22eb0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
22ec0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
22ed0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22ee0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
22ef0 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
22f00 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
22f10 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
22f20 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
22f30 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
22f40 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
22f50 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
22f60 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
22f70 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
22f80 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
22f90 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
22fa0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
22fb0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
22fc0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
22fd0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
22fe0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
22ff0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
23000 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23010 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
23020 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
23030 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
23040 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
23050 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
23060 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
23070 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
23080 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
23090 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
230a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
230b0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
230c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
230d0 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
230e0 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
230f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
23100 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
23110 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
23120 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
23130 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
23140 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
23150 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
23160 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
23170 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
23180 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
23190 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
231a0 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
231b0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
231c0 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
231d0 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
231e0 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
231f0 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
23200 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
23210 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
23220 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
23230 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
23240 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
23250 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
23260 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
23270 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
23280 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
23290 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
232a0 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
232b0 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
232c0 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
232d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
232e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
232f0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
23300 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
23310 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
23320 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
23330 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
23340 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
23350 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50  );.  }..  v = pP
23360 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
23370 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  i;.  if( v>lhs )
23380 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
23390 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
233a0 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
233b0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
233c0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
233d0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
233e0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
233f0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
23400 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
23410 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
23420 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
23430 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
23440 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
23450 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23460 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
23470 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
23480 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
23490 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
234a0 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
234b0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
234c0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
234d0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
234e0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
234f0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
23500 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
23510 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
23520 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
23530 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
23540 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
23550 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
23560 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
23570 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
23580 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
23590 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
235a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
235b0 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
235c0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
235d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
235e0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
235f0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
23600 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
23610 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
23620 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
23630 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
23640 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
23650 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
23660 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
23670 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
23680 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
23690 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
236a0 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
236b0 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
236c0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
236d0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
236e0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
236f0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
23700 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
23710 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
23720 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
23730 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
23740 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
23750 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
23760 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
23770 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
23780 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
23790 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
237a0 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
237b0 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
237c0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
237d0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
237e0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
237f0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
23800 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
23810 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
23820 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
23830 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
23840 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
23850 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
23860 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
23870 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
23880 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
23890 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
238a0 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
238b0 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
238c0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
238d0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
238e0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
238f0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
23900 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
23910 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
23920 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
23930 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
23940 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
23950 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
23960 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
23970 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
23980 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
239a0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
239b0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
239c0 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
239d0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
239e0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
239f0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
23a00 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
23a10 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
23a20 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
23a30 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
23a40 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
23a50 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
23a60 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
23a70 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
23a80 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
23a90 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
23aa0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
23ab0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
23ac0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
23ad0 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
23ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23af0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
23b00 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
23b10 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
23b20 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
23b30 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
23b40 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
23b50 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23b60 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
23b70 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
23b80 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
23b90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
23ba0 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
23bb0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
23bc0 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
23bd0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
23be0 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
23bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
23c00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
23c10 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
23c20 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
23c30 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
23c40 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
23c50 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
23c60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
23c70 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
23c80 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
23c90 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23ca0 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
23cb0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
23cc0 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
23cd0 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
23ce0 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
23cf0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
23d00 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
23d10 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
23d20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
23d30 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
23d40 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
23d50 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
23d60 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
23d70 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
23d80 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
23d90 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
23da0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
23db0 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
23dc0 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
23dd0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
23de0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
23df0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
23e00 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
23e10 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
23e20 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
23e30 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
23e40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
23e50 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
23e60 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
23e70 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
23e80 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
23e90 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
23ea0 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
23eb0 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
23ec0 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
23ed0 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
23ee0 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
23ef0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
23f00 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
23f10 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
23f20 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
23f30 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
23f40 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
23f50 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
23f60 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
23f70 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
23f80 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
23f90 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
23fa0 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
23fb0 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
23fc0 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
23fd0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
23fe0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
23ff0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
24000 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
24010 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
24020 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
24030 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
24040 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
24050 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
24060 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
24070 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
24080 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
24090 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
240a0 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  tes.  */.  if( p
240b0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  ->pKeyInfo->nAll
240c0 46 69 65 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20  Field<=13 ){.   
240d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e   int flags = p->
240e0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20  aMem[0].flags;. 
240f0 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e     if( p->pKeyIn
24100 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
24110 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  ] ){.      p->r1
24120 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
24130 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
24140 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
24150 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
24160 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
24170 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
24180 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
24190 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
241a0 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
241b0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
241c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
241d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
241e0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
241f0 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
24200 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
24210 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
24220 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
24230 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d  al|MEM_IntReal|M
24240 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
24250 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 2d  ))==0.     && p-
24260 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
24270 5b 30 5d 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  [0]==0.    ){.  
24280 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
24290 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
242a0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
242b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
242c0 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
242d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
242e0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
242f0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
24300 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
24310 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
24320 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
24330 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
24340 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
24350 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
24360 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
24370 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
24380 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
24390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
243a0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
243b0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
243c0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
243d0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
243e0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
243f0 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
24400 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
24410 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
24420 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
24430 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
24440 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
24450 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
24460 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
24470 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
24480 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
24490 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
244a0 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
244b0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
244c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
244d0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
244e0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
244f0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
24500 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
24510 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
24520 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
24530 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
24540 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
24550 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
24560 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
24570 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
24580 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
24590 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
245a0 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
245b0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
245c0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
245d0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
245e0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
245f0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
24600 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
24610 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
24620 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
24630 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
24640 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
24650 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
24660 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
24670 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
24680 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
24690 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
246a0 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
246b0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
246c0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
246d0 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ur);.  assert( (
246e0 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
246f0 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
24700 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
24710 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
24720 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
24730 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
24740 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
24750 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
24760 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
24770 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
24780 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
24790 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
247a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
247b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
247c0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
247d0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
247e0 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
247f0 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
24800 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
24810 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
24820 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
24830 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
24840 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
24850 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
24860 64 72 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b  dr>0x7fffffff );
24870 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d  .  assert( m.n>=
24880 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  0 );.  if( unlik
24890 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73  ely(szHdr<3 || s
248a0 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d  zHdr>(unsigned)m
248b0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
248c0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
248d0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
248e0 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
248f0 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
24900 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
24910 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
24920 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
24930 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
24940 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
24950 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
24960 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
24970 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
24980 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
24990 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
249a0 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
249b0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
249c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
249d0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
249e0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
249f0 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
24a00 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
24a10 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
24a20 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
24a30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
24a40 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
24a50 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
24a60 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
24a70 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
24a80 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
24a90 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
24aa0 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
24ab0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
24ac0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
24ad0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
24ae0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
24af0 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
24b00 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
24b10 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
24b20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
24b30 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
24b40 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
24b50 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
24b60 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
24b70 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
24b80 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
24b90 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
24ba0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
24bb0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
24bc0 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
24bd0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
24be0 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
24bf0 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
24c00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
24c10 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
24c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
24c30 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
24c40 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
24c50 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
24c60 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
24c70 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
24c80 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
24c90 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
24ca0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
24cb0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
24cc0 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
24cd0 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
24ce0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
24cf0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
24d00 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
24d10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
24d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
24d30 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
24d40 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
24d50 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
24d60 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
24d70 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
24d80 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
24d90 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
24da0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
24db0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
24dc0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
24dd0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
24de0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
24df0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
24e00 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
24e10 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
24e20 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
24e30 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
24e40 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
24e50 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
24e60 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
24e70 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
24e80 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
24e90 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
24ea0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
24eb0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
24ec0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
24ed0 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
24ee0 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
24ef0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
24f00 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
24f10 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
24f20 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
24f30 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
24f40 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
24f50 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
24f60 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
24f70 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f90 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
24fa0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
24fb0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
24fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24fd0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
24fe0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
24ff0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
25000 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
25010 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
25020 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
25030 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
25060 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
25070 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
25080 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
25090 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
250a0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
250b0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
250c0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
250d0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
250e0 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
250f0 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
25100 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
25110 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
25120 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
25130 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
25140 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
25150 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
25160 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
25170 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
25180 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
25190 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
251a0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
251b0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
251c0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
251d0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
251e0 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
251f0 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
25200 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
25210 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
25220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25230 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25240 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
25250 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
25260 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
25270 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
25280 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
25290 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
252a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
252b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
252c0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
252d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
252e0 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e  WithSkip(m.n, m.
252f0 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29  z, pUnpacked, 0)
25300 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
25310 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
25320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25330 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
25340 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
25350 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
25360 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
25370 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
25380 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
25390 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
253a0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
253b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
253c0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
253d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
253e0 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
253f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25400 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
25410 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
25420 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
25430 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
25440 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
25450 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
25460 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
25470 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
25480 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
25490 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
254a0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
254b0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
254c0 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
254d0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
254e0 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
254f0 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
25500 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
25510 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
25520 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
25530 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
25540 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
25550 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
25560 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
25570 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
25580 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
25590 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
255a0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
255b0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
255c0 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
255d0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
255e0 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
255f0 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
25600 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
25610 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
25620 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
25630 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
25640 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
25650 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
25660 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
25670 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
25680 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
25690 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73  *.** If iCode is
256a0 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74   1, then expirat
256b0 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e  ion is advisory.
256c0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
256d0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70  should.** be rep
256e0 72 65 70 61 72 65 64 20 62 65 66 6f 72 65 20 62  repared before b
256f0 65 69 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20  eing restarted, 
25700 62 75 74 20 69 66 20 69 74 20 69 73 20 61 6c 72  but if it is alr
25710 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20  eady running.** 
25720 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  it is allowed to
25730 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
25740 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e  on..**.** Intern
25750 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
25760 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68  ion just sets th
25770 65 20 56 64 62 65 2e 65 78 70 69 72 65 64 20 66  e Vdbe.expired f
25780 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72  lag on all.** pr
25790 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
257a0 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  s.  The flag is 
257b0 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20  set to 1 for an 
257c0 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69 72 61  immediate expira
257d0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20  tion.** and set 
257e0 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69  to 2 for an advi
257f0 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e  sory expiration.
25800 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25810 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
25820 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
25830 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29   *db, int iCode)
25840 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
25850 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
25860 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
25870 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
25880 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a   = iCode+1;.  }.
25890 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
258a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
258b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
258c0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
258d0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
258e0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
258f0 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
25900 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
25910 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c  QLITE_PREPARE fl
25920 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a  ags for a Vdbe..
25930 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  */.u8 sqlite3Vdb
25940 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64  ePrepareFlags(Vd
25950 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
25960 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d   v->prepFlags;.}
25970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
25980 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
25990 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
259a0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
259b0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
259c0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
259d0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
259e0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
259f0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
25a00 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
25a10 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
25a20 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
25a30 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
25a40 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
25a50 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
25a60 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
25a70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
25a80 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
25a90 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
25aa0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
25ab0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
25ac0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
25ad0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
25ae0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
25af0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
25b00 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
25b10 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
25b20 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
25b30 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
25b40 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
25b50 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
25b60 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
25b70 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
25b80 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
25b90 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
25ba0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
25bb0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
25bc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
25bd0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
25be0 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
25bf0 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
25c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25c10 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
25c20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
25c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
25c40 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
25c50 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
25c60 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
25c70 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
25c80 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
25c90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
25ca0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
25cb0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
25cc0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
25cd0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
25ce0 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
25cf0 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
25d00 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
25d10 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
25d20 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
25d30 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
25d40 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
25d50 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
25d60 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
25d70 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
25d80 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
25d90 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64  .  assert( (v->d
25da0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
25db0 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
25dc0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d   );.  if( iVar>=
25dd0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
25de0 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30  mask |= 0x800000
25df0 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
25e00 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
25e10 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
25e20 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  1));.  }.}../*.*
25e30 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69  * Cause a functi
25e40 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65  on to throw an e
25e50 72 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63  rror if it was c
25e60 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65  all from OP_Pure
25e70 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74  Func.** rather t
25e80 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e  han OP_Function.
25e90 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75  .**.** OP_PureFu
25ea0 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  nc means that th
25eb0 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  e function must 
25ec0 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  be deterministic
25ed0 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  , and should.** 
25ee0 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  throw an error i
25ef0 66 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e  f it is given in
25f00 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20  puts that would 
25f10 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65  make it non-dete
25f20 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68  rministic..** Th
25f30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
25f40 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69  voked by date/ti
25f50 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  me functions tha
25f60 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  t use non-determ
25f70 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75  inistic.** featu
25f80 72 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77  res such as 'now
25f90 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  '..*/.int sqlite
25fa0 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c  3NotPureFunc(sql
25fb0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
25fc0 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  tx){.#ifdef SQLI
25fd0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
25fe0 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
25ff0 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20  Ctx->pVdbe==0 ) 
26000 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
26010 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64  .  if( pCtx->pVd
26020 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f  be->aOp[pCtx->iO
26030 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75  p].opcode==OP_Pu
26040 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  reFunc ){.    sq
26050 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
26060 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
26070 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73   "non-determinis
26080 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  tic function in 
26090 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
260a0 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   or CHECK constr
260b0 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31  aint",.       -1
260c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
260d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
260e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
260f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
26100 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ABLE./*.** Trans
26110 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fer error messag
26120 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73  e text from an s
26130 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72  qlite3_vtab.zErr
26140 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
26150 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
26160 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
26170 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f  te3_malloc) into
26180 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20   a Vdbe.zErrMsg 
26190 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
261a0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
261b0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
261c0 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69  bMalloc)..*/.voi
261d0 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70  d sqlite3VtabImp
261e0 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a  ortErrmsg(Vdbe *
261f0 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  p, sqlite3_vtab 
26200 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70  *pVtab){.  if( p
26210 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
26220 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
26230 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71   = p->db;.    sq
26240 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
26250 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
26260 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
26270 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
26280 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
26290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
262a0 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
262b0 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e  sg);.    pVtab->
262c0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
262d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
262e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
262f0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
26300 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
26310 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f  REUPDATE_HOOK../
26320 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
26330 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
26340 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65  ot NULL, release
26350 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   any allocations
26360 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
26370 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20  with the memory 
26380 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e  cells in the p->
26390 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c  aMem[] array. Al
263a0 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61  so free the Unpa
263b0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
263c0 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20  ructure itself, 
263d0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
263e0 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
263f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
26400 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63  ed to free Unpac
26410 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
26420 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ures allocated b
26430 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70  y.** the vdbeUnp
26440 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
26450 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64  tion found in vd
26460 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74  beapi.c..*/.stat
26470 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
26480 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33  Unpacked(sqlite3
26490 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64   *db, int nField
264a0 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  , UnpackedRecord
264b0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
264c0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
264d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
264e0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d  d; i++){.      M
264f0 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
26500 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Mem[i];.      if
26510 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  ( pMem->zMalloc 
26520 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
26530 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
26540 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26550 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
26560 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
26570 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
26580 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
26590 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
265a0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
265b0 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  _HOOK./*.** Invo
265c0 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
265d0 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20  e hook. If this 
265e0 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
265f0 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74  DELETE pre-updat
26600 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  e call,.** then 
26610 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
26620 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26630 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e  ment should poin
26640 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f  t to the row abo
26650 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61  ut.** to be upda
26660 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  te or deleted. I
26670 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
26680 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
26690 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c  preupdate_old(),
266a0 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64  .** the required
266b0 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
266c0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77  ead from the row
266d0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
266e0 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ts to..*/.void s
266f0 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64  qlite3VdbePreUpd
26700 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20  ateHook(.  Vdbe 
26710 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
26720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
26730 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  be pre-update ho
26740 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  ok is invoked by
26750 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
26760 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
26770 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
26780 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61  to grab old.* va
26790 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  lues from */.  i
267a0 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
267c0 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  * SQLITE_INSERT,
267d0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
267e0 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
267f0 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
26800 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
26810 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  se name */.  Tab
26820 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26840 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a  Modified table *
26850 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20  /.  i64 iKey1,  
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b      /* Initial k
26880 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  ey value */.  in
26890 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20  t iReg          
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
268b0 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65   Register for ne
268c0 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  w.* record */.){
268d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
268e0 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b   v->db;.  i64 iK
268f0 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65  ey2;.  PreUpdate
26900 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f   preupdate;.  co
26910 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
26920 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
26930 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
26940 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20  fakeSortOrder = 
26950 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  0;..  assert( db
26960 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20  ->pPreUpdate==0 
26970 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65  );.  memset(&pre
26980 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f  update, 0, sizeo
26990 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20  f(PreUpdate));. 
269a0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
269b0 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b  ab)==0 ){.    iK
269c0 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b  ey1 = iKey2 = 0;
269d0 0a 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70  .    preupdate.p
269e0 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
269f0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
26a00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26a10 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
26a20 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  PDATE ){.      i
26a30 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69  Key2 = v->aMem[i
26a40 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65  Reg].u.i;.    }e
26a50 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32  lse{.      iKey2
26a60 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a   = iKey1;.    }.
26a70 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
26a80 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
26a90 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20  b->nCol .       
26aa0 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64  || (pCsr->nField
26ab0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26  ==pTab->nCol+1 &
26ac0 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  & op==SQLITE_DEL
26ad0 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29  ETE && iReg==-1)
26ae0 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61  .  );..  preupda
26af0 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75  te.v = v;.  preu
26b00 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73  pdate.pCsr = pCs
26b10 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f  r;.  preupdate.o
26b20 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64  p = op;.  preupd
26b30 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52  ate.iNewReg = iR
26b40 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  eg;.  preupdate.
26b50 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b  keyinfo.db = db;
26b60 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
26b70 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64  info.enc = ENC(d
26b80 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  b);.  preupdate.
26b90 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
26ba0 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  d = pTab->nCol;.
26bb0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
26bc0 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d  nfo.aSortOrder =
26bd0 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f   (u8*)&fakeSortO
26be0 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74  rder;.  preupdat
26bf0 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b  e.iKey1 = iKey1;
26c00 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
26c10 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72  y2 = iKey2;.  pr
26c20 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70  eupdate.pTab = p
26c30 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Tab;..  db->pPre
26c40 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
26c50 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
26c60 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
26c70 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
26c80 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
26c90 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
26ca0 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
26cb0 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
26cc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
26cd0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
26ce0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
26cf0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
26d00 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
26d10 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
26d20 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76  .pUnpacked);.  v
26d30 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
26d40 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65  db, preupdate.ke
26d50 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b  yinfo.nKeyField+
26d60 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65  1, preupdate.pNe
26d70 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66  wUnpacked);.  if
26d80 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  ( preupdate.aNew
26d90 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
26da0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
26db0 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  sr->nField; i++)
26dc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
26dd0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70  dbeMemRelease(&p
26de0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d  reupdate.aNew[i]
26df0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26e00 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
26e10 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
26e20 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
26e30 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
26e40 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
26e50 2f 0a                                            /.