/ Hex Artifact Content
Login

Artifact a262a279d30bcddf851e5f836ac28de1d232062d409b9cf5562d28e66b986a98:


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 61 73 73 65  >nOp;.      asse
e440: 72 74 28 20 61 70 53 75 62 21 3d 30 20 29 3b 0a  rt( apSub!=0 );.
e450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
e460: 75 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  ub>0 );.      fo
e470: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
e480: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
e490: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
e4a0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
e4b0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 61 70 53     assert( i<apS
e4c0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 20 7c 7c 20 6a 2b  ub[j]->nOp || j+
e4d0: 31 3c 6e 53 75 62 20 29 3b 0a 20 20 20 20 20 20  1<nSub );.      
e4e0: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
e4f0: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
e500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
e510: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
e520: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
e530: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
e540: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
e550: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
e560: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
e570: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
e580: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
e590: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
e5a0: 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e    ** kept in p->
e5b0: 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c  aMem[9].z to hol
e5c0: 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61  d the new progra
e5d0: 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69  m - assuming thi
e5e0: 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20  s subprogram.   
e5f0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
e600: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
e610: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c     */.    if( bL
e620: 69 73 74 53 75 62 70 72 6f 67 73 20 26 26 20 70  istSubprogs && p
e630: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
e640: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
e650: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
e660: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
e670: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
e680: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
e690: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
e6a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
e6b0: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
e6c0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
e6d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e6e0: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
e6f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
e700: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
e710: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
e720: 74 65 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20  te, nSub!=0);.  
e730: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21        if( p->rc!
e740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e750: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e760: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
e770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70      }.        ap
e790: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
e7a0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
e7b0: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
e7c0: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
e7d0: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
e7e0: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
e7f0: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
e800: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
e810: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
e820: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f  m*);.        nRo
e830: 77 20 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  w += pOp->p4.pPr
e840: 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ogram->nOp;.    
e850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e860: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29  ( p->explain<2 )
e870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
e880: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e890: 45 78 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b  Explain ) break;
e8a0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
e8b0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
e8c0: 20 70 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b   p->pc>1 ) break
e8d0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
e8e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e8f0: 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49    if( db->u1.isI
e900: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
e910: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
e920: 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
e930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e940: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
e950: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
e960: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70   sqlite3ErrStr(p
e970: 2d 3e 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ->rc));.    }els
e980: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
e990: 50 34 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  P4;.      if( p-
e9a0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
e9b0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
e9c0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
e9d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e9e0: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
ea10: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
ea20: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20    pMem++;.    . 
ea30: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
ea40: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
ea50: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ea60: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ea70: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
ea80: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
ea90: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
eaa0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
eab0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
eac0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  =0 );.        pM
ead0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
eae0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
eaf0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
eb00: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
eb10: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b  8;.        pMem+
eb20: 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  +;.      }..    
eb30: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
eb40: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
eb50: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
eb60: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb80: 50 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P1 */.      pMem
eb90: 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++;..      pMem-
eba0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ebb0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
ebc0: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
ebf0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
ec00: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ec10: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
ec20: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
ec30: 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20  ->p3;           
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec50: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P3 */.      pM
ec60: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  em++;..      if(
ec70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
ec80: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
ec90: 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50  em, 100) ){ /* P
eca0: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  4 */.        ass
ecb0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
ecc0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
ecd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ece0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
ecf0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ed00: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
ed10: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34  _Term;.      zP4
ed20: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
ed30: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
ed40: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
ed50: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
ed60: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  >z ){.        pM
ed70: 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
ed80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
ed90: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
eda0: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
edb0: 46 38 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  F8, 0);.      }e
edc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
edd0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
ede0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
edf0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
ee00: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
ee10: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
ee20: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ee30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
ee40: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  em++;..      if(
ee50: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
ee60: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
ee70: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
ee80: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
ee90: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   4) ){.         
eea0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
eeb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
eec0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
eed0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
eee0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
eef0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ef00: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ef10: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
ef20: 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71   = 2;.        sq
ef30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
ef40: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  , pMem->z, "%.2x
ef50: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
ef60: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P5 */.        
ef70: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
ef80: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
ef90: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69   pMem++;.    .#i
efa0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
efb0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
efc0: 4e 54 53 0a 20 20 20 20 20 20 20 20 69 66 28 20  NTS.        if( 
efd0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
efe0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
eff0: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
f000: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f010: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f020: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
f030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f040: 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
f050: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f060: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
f070: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
f080: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
f090: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
f0a0: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
f0b0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
f0c0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
f0d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d  #else.        pM
f0e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f0f0: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
f100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f110: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
f120: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
f130: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
f140: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
f150: 6e 2d 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  n-1);.      p->p
f160: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
f170: 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70  aMem[1];.      p
f180: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
f190: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
f1a0: 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20  ITE_ROW;.    }. 
f1b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
f1c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f1d0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
f1e0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
f1f0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
f200: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
f210: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
f220: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
f230: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
f240: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
f250: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
f260: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
f270: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
f280: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
f290: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
f2a0: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
f2b0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
f2c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
f2d0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
f2e0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
f2f0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
f300: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
f310: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
f320: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
f330: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
f340: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
f350: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
f360: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
f370: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
f380: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
f390: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
f3a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
f3b0: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
f3c0: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
f3d0: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
f3e0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
f3f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
f400: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
f410: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
f420: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
f430: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
f440: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
f450: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
f460: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
f470: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
f480: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
f490: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
f4a0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
f4b0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
f4c0: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
f4d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
f4e0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
f4f0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
f500: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
f510: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
f520: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
f530: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
f540: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
f550: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
f560: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
f570: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
f580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
f590: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
f5a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f5b0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
f5c0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
f5d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
f5e0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
f5f0: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
f600: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
f610: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
f620: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
f630: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
f640: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69  RACE */../* An i
f650: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
f660: 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73  object describes
f670: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61   bulk memory ava
f680: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a  ilable for use.*
f690: 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e  * by subcomponen
f6a0: 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64  ts of a prepared
f6b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61   statement.  Spa
f6c0: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ce is allocated 
f6d0: 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73  out.** of a Reus
f6e0: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
f6f0: 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61   by the allocSpa
f700: 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c  ce() routine bel
f710: 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65  ow..*/.struct Re
f720: 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20  usableSpace {.  
f730: 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  u8 *pSpace;     
f740: 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61         /* Availa
f750: 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ble memory */.  
f760: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 46  sqlite3_int64 nF
f770: 72 65 65 3b 20 20 20 2f 2a 20 42 79 74 65 73 20  ree;   /* Bytes 
f780: 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d  of available mem
f790: 6f 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ory */.  sqlite3
f7a0: 5f 69 6e 74 36 34 20 6e 4e 65 65 64 65 64 3b 20  _int64 nNeeded; 
f7b0: 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74  /* Total bytes t
f7c0: 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  hat could not be
f7d0: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b   allocated */.};
f7e0: 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f  ../* Try to allo
f7f0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
f800: 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
f810: 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66  ed bulk memory f
f820: 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20  or pBuf.** from 
f830: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
f840: 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  e object.  Retur
f850: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
f860: 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  he allocated.** 
f870: 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73  memory on succes
f880: 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  s.  If insuffici
f890: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ent memory is av
f8a0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a  ailable in the.*
f8b0: 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  * ReusableSpace 
f8c0: 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65  object, increase
f8d0: 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
f8e0: 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61  ce.nNeeded.** va
f8f0: 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  lue by the amoun
f900: 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74  t needed and ret
f910: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
f920: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69  If pBuf is not i
f930: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
f940: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
f950: 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c  he memory has al
f960: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c  ready.** been al
f970: 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69  located by a pri
f980: 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  or call to this 
f990: 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74  routine, so just
f9a0: 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a   return a copy.*
f9b0: 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65  * of pBuf and le
f9c0: 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  ave ReusableSpac
f9d0: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  e unchanged..**.
f9e0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f  ** This allocato
f9f0: 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f  r is employed to
fa00: 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65   repurpose unuse
fa10: 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65  d slots at the e
fa20: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63  nd of the.** opc
fa30: 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65  ode array of pre
fa40: 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20  pared state for 
fa50: 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65  other memory nee
fa60: 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ds of the prepar
fa70: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  ed.** statement.
fa80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fa90: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73  *allocSpace(.  s
faa0: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
fab0: 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b  ace *p,  /* Bulk
fac0: 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
fad0: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
fae0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
faf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fb00: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
fb10: 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
fb20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
fb30: 74 36 34 20 6e 42 79 74 65 20 20 20 20 20 20 20  t64 nByte       
fb40: 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
fb50: 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a  ry needed */.){.
fb60: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
fb70: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
fb80: 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69  ->pSpace) );.  i
fb90: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
fba0: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
fbb0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
fbc0: 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72   nByte <= p->nFr
fbd0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ee ){.      p->n
fbe0: 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
fbf0: 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e       pBuf = &p->
fc00: 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d  pSpace[p->nFree]
fc10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fc20: 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d     p->nNeeded +=
fc30: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
fc40: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
fc50: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
fc60: 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
fc70: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
fc80: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
fc90: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
fca0: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
fcb0: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
fcc0: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
fcd0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
fce0: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
fcf0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
fd00: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
fd10: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
fd20: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
fd30: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
fd40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
fd50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
fd60: 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67  C_INIT || p->mag
fd70: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
fd80: 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ESET );..  /* Th
fd90: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
fda0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
fdb0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
fdc0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
fdd0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
fde0: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
fdf0: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
fe00: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
fe10: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
fe20: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
fe30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
fe40: 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  UG.  for(i=0; i<
fe50: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
fe60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
fe70: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
fe80: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
fe90: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
fea0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
feb0: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
fec0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
fed0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
fee0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
fef0: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
ff00: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
ff10: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
ff20: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
ff30: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
ff40: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
ff50: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
ff60: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
ff70: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
ff80: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
ff90: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
ffa0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ffb0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
ffc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
ffd0: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
ffe0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
fff0: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
10000 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
10010 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
10020 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
10030 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
10040 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69   registers and i
10050 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
10060 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
10070 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
10080 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
10090 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
100a0 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
100b0 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
100c0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
100d0 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
100e0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
100f0 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20   called exactly 
10100 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72  once on each vir
10110 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
10120 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
10130 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
10140 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
10150 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
10160 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
10170 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
10180 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
10190 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
101a0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
101b0 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
101c0 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
101d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
101e0 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
101f0 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
10200 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
10210 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
10220 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
10230 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
10240 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
10250 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
10260 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
10270 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
10280 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
10290 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
102a0 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
102b0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
102c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
102d0 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
102e0 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
102f0 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
10300 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
10310 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
10320 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
10350 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10380 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
10390 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
103a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
103b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
103c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
103d0 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
103e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
103f0 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
10400 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
10410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10420 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10430 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
10440 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
10450 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
10460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10470 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
10480 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
10490 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104b0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
104c0 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
104d0 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ams */.  int n; 
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10500 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72  counter */.  str
10510 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
10520 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  e x;        /* R
10530 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d  eusable bulk mem
10540 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ory */..  assert
10550 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
10560 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
10570 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
10580 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10590 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
105a0 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
105b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
105c0 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
105d0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
105e0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
105f0 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
10600 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
10610 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
10620 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
10630 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
10640 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
10650 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
10660 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73 6f  .  /* Each curso
10670 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79 20  r uses a memory 
10680 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73 74  cell.  The first
10690 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72 20   cursor (cursor 
106a0 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20  0) can.  ** use 
106b0 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69 73  aMem[0] which is
106c0 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 75   not otherwise u
106d0 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  sed by the VDBE 
106e0 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61  program.  Alloca
106f0 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61 74  te.  ** space at
10700 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d   the end of aMem
10710 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20 31  [] for cursors 1
10720 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20 20   and greater..  
10730 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
10740 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
10750 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
10760 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75  ursor;.  if( nCu
10770 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e  rsor==0 && nMem>
10780 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20  0 ) nMem++;  /* 
10790 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30  Space for aMem[0
107a0 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75 73  ] even if not us
107b0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ed */..  /* Figu
107c0 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
107d0 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20  reusable memory 
107e0 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  is available at 
107f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
10800 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79   ** opcode array
10810 2e 20 20 54 68 69 73 20 65 78 74 72 61 20 6d 65  .  This extra me
10820 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65 61  mory will be rea
10830 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74 68  llocated for oth
10840 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  er elements.  **
10850 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64   of the prepared
10860 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
10870 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69  .  n = ROUND8(si
10880 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29  zeof(Op)*p->nOp)
10890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
108a0 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f 64  * Bytes of opcod
108b0 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f  e memory used */
108c0 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26 28  .  x.pSpace = &(
108d0 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b  (u8*)p->aOp)[n];
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108f0 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65 20  * Unused opcode 
10900 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65  memory */.  asse
10910 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
10920 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63  LIGNMENT(x.pSpac
10930 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20  e) );.  x.nFree 
10940 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61  = ROUNDDOWN8(pPa
10950 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d  rse->szOpAlloc -
10960 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f   n);  /* Bytes o
10970 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  f unused memory 
10980 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e  */.  assert( x.n
10990 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Free>=0 );.  ass
109a0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
109b0 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70  ALIGNMENT(&x.pSp
109c0 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b  ace[x.nFree]) );
109d0 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
109e0 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
109f0 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
10a00 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
10a10 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
10a20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
10a30 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
10a40 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
10a50 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
10a60 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70  em = 10;.  }.  p
10a70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
10a80 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
10a90 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
10aa0 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
10ab0 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
10ac0 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20   in one or two. 
10ad0 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20   ** passes.  On 
10ae0 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20  the first pass, 
10af0 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20  we try to reuse 
10b00 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74  unused memory at
10b10 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
10b20 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
10b30 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
10b40 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
10b50 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
10b60 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
10b70 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
10b80 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
10b90 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
10ba0 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
10bb0 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ill in the remai
10bc0 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65  nder using a fre
10bd0 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  sh memory alloca
10be0 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  tion.  .  **.  *
10bf0 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20  * This two-pass 
10c00 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65  approach that re
10c10 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d  uses as much mem
10c20 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
10c30 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65  from.  ** the le
10c40 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74  ftover memory at
10c50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10c60 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54  opcode array.  T
10c70 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63  his can signific
10c80 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
10c90 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
10ca0 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
10cb0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
10cc0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e 4e  ent..  */.  x.nN
10cd0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e  eeded = 0;.  p->
10ce0 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
10cf0 65 28 26 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73 69  e(&x, 0, nMem*si
10d00 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d  zeof(Mem));.  p-
10d10 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
10d20 63 65 28 26 78 2c 20 30 2c 20 6e 56 61 72 2a 73  ce(&x, 0, nVar*s
10d30 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70  izeof(Mem));.  p
10d40 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
10d50 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 41 72 67  pace(&x, 0, nArg
10d60 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a  *sizeof(Mem*));.
10d70 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c    p->apCsr = all
10d80 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e  ocSpace(&x, 0, n
10d90 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
10da0 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66  beCursor*));.#if
10db0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10dc0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
10dd0 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20  S.  p->anExec = 
10de0 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30  allocSpace(&x, 0
10df0 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
10e00 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
10e10 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 20 29 7b  if( x.nNeeded ){
10e20 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20  .    x.pSpace = 
10e30 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
10e40 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
10e50 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a  db, x.nNeeded);.
10e60 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e      x.nFree = x.
10e70 6e 4e 65 65 64 65 64 3b 0a 20 20 20 20 69 66 28  nNeeded;.    if(
10e80 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
10e90 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  ed ){.      p->a
10ea0 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
10eb0 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  (&x, p->aMem, nM
10ec0 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  em*sizeof(Mem));
10ed0 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  .      p->aVar =
10ee0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10ef0 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
10f00 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
10f10 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
10f20 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10f30 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
10f40 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 20 20  f(Mem*));.      
10f50 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
10f60 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43  Space(&x, p->apC
10f70 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
10f80 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29  of(VdbeCursor*))
10f90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
10fa0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
10fb0 53 54 41 54 55 53 0a 20 20 20 20 20 20 70 2d 3e  STATUS.      p->
10fc0 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70  anExec = allocSp
10fd0 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65  ace(&x, p->anExe
10fe0 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  c, p->nOp*sizeof
10ff0 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
11000 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70     }.  }..  p->p
11010 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d 3e  VList = pParse->
11020 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65  pVList;.  pParse
11030 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20  ->pVList =  0;. 
11040 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50   p->explain = pP
11050 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20  arse->explain;. 
11060 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11070 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
11080 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  nVar = 0;.    p-
11090 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >nCursor = 0;.  
110a0 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20    p->nMem = 0;. 
110b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
110c0 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
110d0 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  ;.    p->nVar = 
110e0 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
110f0 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d   initMemArray(p-
11100 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c  >aVar, nVar, db,
11110 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
11120 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a  p->nMem = nMem;.
11130 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79      initMemArray
11140 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20  (p->aMem, nMem, 
11150 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  db, MEM_Undefine
11160 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  d);.    memset(p
11170 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72  ->apCsr, 0, nCur
11180 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
11190 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
111a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
111b0 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
111c0 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45     memset(p->anE
111d0 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73  xec, 0, p->nOp*s
111e0 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e  izeof(i64));.#en
111f0 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
11200 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
11210 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
11220 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
11230 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
11240 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
11250 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
11260 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
11270 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
11280 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
11290 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
112a0 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
112b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
112c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
112d0 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70  Cx->pBtx==0 || p
112e0 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  Cx->eCurType==CU
112f0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
11300 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43   switch( pCx->eC
11310 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61  urType ){.    ca
11320 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45  se CURTYPE_SORTE
11330 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
11340 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73  e3VdbeSorterClos
11350 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20  e(p->db, pCx);. 
11360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11370 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  }.    case CURTY
11380 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20  PE_BTREE: {.    
11390 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70 68    if( pCx->isEph
113a0 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20 20  emeral ){.      
113b0 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78 20    if( pCx->pBtx 
113c0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  ) sqlite3BtreeCl
113d0 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a  ose(pCx->pBtx);.
113e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
113f0 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
11400 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
11410 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
11420 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20  xists, by.      
11430 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
11440 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65  ove. */.      }e
11450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
11460 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75  ert( pCx->uc.pCu
11470 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rsor!=0 );.     
11480 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
11490 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
114a0 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
114b0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
114c0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
114d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
114e0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
114f0 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20  e CURTYPE_VTAB: 
11500 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11510 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43  vtab_cursor *pVC
11520 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43  ur = pCx->uc.pVC
11530 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ur;.      const 
11540 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
11550 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d  pModule = pVCur-
11560 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
11570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11580 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
11590 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43  f>0 );.      pVC
115a0 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d  ur->pVtab->nRef-
115b0 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65  -;.      pModule
115c0 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b  ->xClose(pVCur);
115d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
115e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
115f0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
11600 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  l cursors in the
11610 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a   current frame..
11620 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
11630 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
11640 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  me(Vdbe *p){.  i
11650 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
11660 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
11670 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
11680 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
11690 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
116a0 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
116b0 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
116c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
116d0 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
116e0 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
116f0 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
11700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11710 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
11720 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
11730 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
11740 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
11750 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
11760 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
11770 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
11780 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
11790 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
117a0 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
117b0 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
117c0 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
117d0 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
117e0 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
117f0 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
11800 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
11810 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
11820 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66  Frame(v);.#ifdef
11830 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11840 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
11850 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72   v->anExec = pFr
11860 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e  ame->anExec;.#en
11870 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  dif.  v->aOp = p
11880 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
11890 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
118a0 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
118b0 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
118c0 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
118d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
118e0 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
118f0 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
11900 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
11910 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
11920 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
11930 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
11940 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
11950 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d  e->nChange;.  v-
11960 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  >db->nChange = p
11970 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
11980 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ;.  sqlite3VdbeD
11990 65 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e  eleteAuxData(v->
119a0 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61  db, &v->pAuxData
119b0 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70  , -1, 0);.  v->p
119c0 41 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65  AuxData = pFrame
119d0 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46  ->pAuxData;.  pF
119e0 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d  rame->pAuxData =
119f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72   0;.  return pFr
11a00 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
11a10 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
11a20 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
11a30 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
11a40 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
11a50 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
11a60 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
11a70 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
11a80 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
11a90 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
11aa0 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
11ab0 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
11ac0 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
11ad0 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
11ae0 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
11af0 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
11b00 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
11b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
11b30 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
11b40 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
11b50 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
11b60 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
11b70 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
11b80 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
11b90 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
11ba0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
11bb0 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
11bc0 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
11bd0 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
11be0 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  .    p->nFrame =
11bf0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
11c00 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29  ( p->nFrame==0 )
11c10 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
11c20 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66  InFrame(p);.  if
11c30 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
11c40 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
11c50 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65  (p->aMem, p->nMe
11c60 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  m);.  }.  while(
11c70 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b   p->pDelFrame ){
11c80 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
11c90 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72  pDel = p->pDelFr
11ca0 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c  ame;.    p->pDel
11cb0 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50  Frame = pDel->pP
11cc0 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
11cd0 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
11ce0 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20  e(pDel);.  }..  
11cf0 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75  /* Delete any au
11d00 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e  xdata allocation
11d10 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d  s made by the VM
11d20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75   */.  if( p->pAu
11d30 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56  xData ) sqlite3V
11d40 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
11d50 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78  (p->db, &p->pAux
11d60 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
11d70 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
11d80 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
11d90 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
11da0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
11db0 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
11dc0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
11dd0 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
11de0 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
11df0 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
11e00 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
11e10 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
11e20 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
11e30 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
11e40 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11e50 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
11e60 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
11e70 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
11e80 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
11e90 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
11ea0 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
11eb0 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
11ec0 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e  ResColumn){.  in
11ed0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
11ee0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69  db = p->db;..  i
11ef0 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  f( p->nResColumn
11f00 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
11f10 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
11f20 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
11f30 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
11f40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11f50 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
11f60 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65  );.  }.  n = nRe
11f70 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
11f80 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
11f90 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f  mn = (u16)nResCo
11fa0 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
11fb0 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69  ame = (Mem*)sqli
11fc0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
11fd0 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
11fe0 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
11ff0 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
12000 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72  urn;.  initMemAr
12010 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
12020 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c   n, db, MEM_Null
12030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
12040 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
12050 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
12060 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12070 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
12080 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
12090 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
120a0 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
120b0 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
120c0 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
120d0 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
120e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
120f0 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
12100 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
12110 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
12120 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
12130 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
12140 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
12150 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
12160 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
12170 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
12180 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
12190 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
121a0 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
121b0 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
121c0 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
121d0 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
121e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
121f0 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
12200 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
12230 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
12240 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
12270 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
12280 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
12290 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122b0 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
122c0 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
122d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
122e0 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
122f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12300 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
12310 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
12320 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
12330 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
12340 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
12350 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
12360 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
12370 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
12380 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
12390 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
123a0 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
123b0 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
123c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
123d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
123e0 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
123f0 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
12400 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
12410 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12420 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
12430 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
12440 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
12450 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
12460 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
12470 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
12480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12490 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
124a0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
124b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
124c0 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
124d0 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
124e0 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
124f0 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
12500 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12510 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
12520 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
12530 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
12540 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
12550 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12560 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
12570 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
12580 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
12590 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
125a0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
125b0 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
125c0 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
125d0 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
125e0 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
125f0 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
12600 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
12610 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
12620 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
12630 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
12640 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
12650 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
12660 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
12670 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
12680 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
12690 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  action.         
126a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
126b0 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73  t are candidates
126c0 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65   for a two-phase
126d0 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a   commit using a.
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
12700 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  rnal */.  int rc
12710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12720 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
12730 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
12740 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12750 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20  TABLE.  /* With 
12760 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c  this option, sql
12770 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69  ite3VtabSync() i
12780 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
12790 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c  simply .  ** SQL
127a0 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e  ITE_OK so p is n
127b0 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20  ot used. .  */. 
127c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
127d0 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  R(p);.#endif..  
127e0 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
127f0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
12800 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
12810 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
12820 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
12830 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
12840 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
12850 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
12860 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
12870 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
12880 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
12890 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
128a0 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
128b0 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
128c0 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
128d0 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
128e0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
128f0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
12900 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
12910 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
12920 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  b, p);..  /* Thi
12930 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
12940 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
12950 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
12960 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
12970 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
12980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
12990 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
129a0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
129b0 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
129c0 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
129d0 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
129e0 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
129f0 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
12a00 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
12a10 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
12a20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12a30 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
12a40 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
12a50 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
12a60 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
12a70 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
12a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12a90 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12aa0 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
12ab0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12ac0 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
12ad0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
12ae0 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
12af0 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  /* Whether or no
12b00 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67  t a database mig
12b10 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72  ht need a master
12b20 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73   journal depends
12b30 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69   upon.      ** i
12b40 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ts journal mode 
12b50 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69  (among other thi
12b60 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72  ngs).  This matr
12b70 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ix determines wh
12b80 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  ich.      ** jou
12b90 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61  rnal modes use a
12ba0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12bb0 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  and which do not
12bc0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
12bd0 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65   const u8 aMJNee
12be0 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ded[] = {.      
12bf0 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f    /* DELETE   */
12c00 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20    1,.        /* 
12c10 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a  PERSIST   */ 1,.
12c20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20          /* OFF  
12c30 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20       */ 0,.     
12c40 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20     /* TRUNCATE  
12c50 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
12c60 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c   MEMORY    */ 0,
12c70 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20  .        /* WAL 
12c80 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20        */ 0.     
12c90 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20   };.      Pager 
12ca0 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61  *pPager;   /* Pa
12cb0 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
12cc0 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20  ith pBt */.     
12cd0 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
12ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
12cf0 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
12d00 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
12d10 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
12d20 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
12d30 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65   db->aDb[i].safe
12d40 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f  ty_level!=PAGER_
12d50 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a  SYNCHRONOUS_OFF.
12d60 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65         && aMJNee
12d70 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72  ded[sqlite3Pager
12d80 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  GetJournalMode(p
12d90 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20 26  Pager)].       &
12da0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  & sqlite3PagerIs
12db0 4d 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d 30  Memdb(pPager)==0
12dc0 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20  .      ){ .     
12dd0 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31 20     assert( i!=1 
12de0 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e  );.        nTran
12df0 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s++;.      }.   
12e00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12e10 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
12e20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
12e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12e40 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
12e50 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
12e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
12e70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
12e80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
12e90 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
12ea0 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
12eb0 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
12ec0 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
12ed0 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
12ee0 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
12ef0 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
12f00 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
12f10 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
12f20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
12f30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12f40 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
12f50 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
12f60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
12f70 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
12f80 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
12f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
12fa0 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
12fb0 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
12fc0 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
12fd0 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
12fe0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
12ff0 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
13000 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
13010 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
13020 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
13030 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
13040 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
13050 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
13060 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
13070 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
13080 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
13090 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
130a0 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
130b0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
130c0 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
130d0 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
130e0 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
130f0 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
13100 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
13110 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
13120 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
13130 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
13140 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
13150 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
13160 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
13170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
13180 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
13190 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
131a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
131b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
131c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
131d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
131e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
131f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13200 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
13210 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
13220 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
13230 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
13240 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
13250 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
13260 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
13270 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
13280 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
13290 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
132a0 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
132b0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
132c0 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
132d0 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
132e0 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
132f0 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
13300 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
13310 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
13320 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
13330 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
13340 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
13350 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
13360 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
13370 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
13380 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
13390 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
133a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
133b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
133c0 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
133d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
133e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
133f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
13400 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
13410 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
13420 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
13430 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
13440 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
13450 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13460 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
13470 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
13480 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
13490 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
134a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
134b0 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
134c0 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  ically..  */.#if
134d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
134e0 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
134f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
13500 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
13510 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
13520 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
13530 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
13540 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
13550 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
13560 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
13570 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
13580 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
13590 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
135a0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
135b0 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
135c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
135d0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
135e0 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
135f0 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
13600 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
13610 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
13620 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
13630 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
13640 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13650 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
13660 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
13670 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
13680 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
13690 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
136a0 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
136b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
136c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f  MEM_BKPT;.    do
136d0 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
136e0 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
136f0 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
13700 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
13710 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
13720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
13730 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
13740 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
13750 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13760 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
13770 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
13780 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
13790 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
137a0 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
137b0 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
137c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
137d0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
137e0 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
137f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13800 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13810 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
13820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
13830 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
13840 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
13850 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
13860 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
13870 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
13880 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
13890 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
138c0 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
138d0 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
138e0 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
138f0 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
13900 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
13910 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
13920 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
13930 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
13940 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
13950 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
13960 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
13970 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
13980 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
13990 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
139a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
139b0 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
139c0 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
139d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
139e0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
139f0 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
13a00 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
13a10 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
13a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13a30 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
13a40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13a50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
13a60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13a70 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
13a80 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
13a90 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
13aa0 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
13ab0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
13ac0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
13ad0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
13ae0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
13af0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
13b00 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
13b10 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
13b20 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
13b30 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
13b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13b50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13b60 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
13b70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13b80 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
13b90 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
13ba0 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
13bb0 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
13bc0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
13bd0 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
13be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
13bf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13c00 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
13c10 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
13c20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
13c30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
13c40 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
13c50 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
13c60 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
13c70 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
13c80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13c90 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
13ca0 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
13cb0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
13cc0 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
13cd0 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
13ce0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13cf0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
13d00 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
13d10 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
13d20 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
13d30 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
13d40 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
13d50 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
13d60 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
13d70 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
13d80 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
13d90 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
13da0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
13db0 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
13dc0 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
13dd0 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
13de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
13df0 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
13e00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
13e10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
13e20 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
13e30 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
13e40 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
13e50 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
13e60 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
13e70 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
13e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
13eb0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
13ec0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
13ed0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13ee0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
13ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13f00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
13f10 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
13f20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13f40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
13f50 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
13f60 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
13f70 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
13f80 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
13f90 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
13fa0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
13fb0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
13fc0 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  ( 0==(sqlite3OsD
13fd0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
13fe0 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
13ff0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
14000 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
14010 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
14020 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
14030 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
14040 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
14050 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14060 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
14070 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
14080 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
14090 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
140a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
140b0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
140c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
140d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
140e0 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
140f0 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
14100 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
14110 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
14120 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
14130 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14140 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
14150 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
14160 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
14170 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
14180 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
14190 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
141a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
141b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
141c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
141d0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
141e0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
141f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
14200 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
14210 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
14220 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
14230 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
14240 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
14250 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
14260 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
14270 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
14280 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
14290 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
142a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
142b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
142c0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
142d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
142e0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
142f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
14300 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
14310 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
14320 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
14330 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
14340 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
14350 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14360 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
14370 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
14380 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14390 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
143a0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
143b0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
143c0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
143d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
143e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14400 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
14410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14420 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
14430 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
14440 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
14450 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
14460 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
14470 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
14480 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
14490 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
144a0 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
144b0 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
144c0 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
144d0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
144e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
144f0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
14500 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
14510 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14520 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
14530 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
14540 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
14550 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14560 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
14570 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
14580 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
14590 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
145a0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
145b0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
145c0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
145d0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
145e0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
145f0 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
14600 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
14610 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
14620 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
14630 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
14640 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
14650 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
14660 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
14670 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
14680 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
14690 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
146a0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
146b0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
146c0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
146d0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
146e0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
146f0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
14700 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
14710 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
14720 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
14730 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
14740 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
14750 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14760 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
14770 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
14780 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
14790 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
147a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
147b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
147c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
147d0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
147e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
147f0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
14800 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
14810 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
14820 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
14830 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
14840 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
14850 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
14860 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
14870 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
14880 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
14890 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
148a0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
148b0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
148c0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
148d0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
148e0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
148f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
14900 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
14910 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
14920 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
14930 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
14940 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
14950 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
14960 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
14970 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
14980 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
14990 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
149a0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
149b0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
149c0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
149d0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
149e0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
149f0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
14a00 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
14a10 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
14a20 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
14a30 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
14a40 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
14a50 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
14a60 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
14a70 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
14a80 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
14a90 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
14aa0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
14ab0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
14ac0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
14ad0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
14ae0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
14af0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
14b00 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
14b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
14b20 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
14b30 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
14b40 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
14b50 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
14b60 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
14b70 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
14b80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
14b90 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
14ba0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
14bb0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
14bc0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
14bd0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
14be0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
14bf0 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
14c00 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
14c10 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
14c20 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
14c30 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
14c40 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
14c50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
14c60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
14c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
14c80 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
14c90 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
14ca0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
14cb0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
14cc0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
14cd0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
14ce0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
14cf0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
14d00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14d10 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
14d20 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
14d30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
14d40 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
14d50 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
14d60 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
14d70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
14d80 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
14d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14da0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
14db0 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
14dc0 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
14dd0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72  ment-1;..  asser
14de0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
14df0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
14e00 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
14e10 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74 28  EASE);.  assert(
14e20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
14e30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14e40 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
14e50 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
14e60 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
14e70 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
14e80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
14e90 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
14ea0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65  ITE_OK;.    Btre
14eb0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
14ec0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
14ed0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66   pBt ){.      if
14ee0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
14ef0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
14f00 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
14f10 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
14f20 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
14f30 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
14f40 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
14f50 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
14f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14f70 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14f80 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
14f90 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
14fa0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
14fb0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14fc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
14fe0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
14ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
15000 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
15010 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
15020 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
15030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15040 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
15050 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
15060 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15070 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
15080 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
15090 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
150a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
150b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
150c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
150d0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
150e0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
150f0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
15100 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oint);.    }.  }
15110 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
15120 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
15130 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
15140 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
15150 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  estore the .  **
15160 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15170 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
15180 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
15190 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
151a0 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d when .  ** the
151b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
151c0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
151d0 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70  d.  */.  if( eOp
151e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
151f0 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  BACK ){.    db->
15200 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
15210 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
15220 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  .    db->nDeferr
15230 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
15240 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
15250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15260 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
15270 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
15280 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
15290 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  p){.  if( p->db-
152a0 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
152b0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
152c0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
152d0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
152e0 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74   eOp);.  }.  ret
152f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15300 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
15310 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15320 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
15330 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
15340 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
15350 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
15360 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
15370 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
15380 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
15390 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
153a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
153b0 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
153c0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
153d0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
153e0 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
153f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
15400 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
15410 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
15420 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
15430 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
15440 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
15450 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
15460 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
15470 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
15480 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
15490 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
154a0 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
154b0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
154c0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
154d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
154e0 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
154f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
15500 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
15510 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
15520 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
15530 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
15540 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
15550 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
15560 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
15570 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
15580 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
15590 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
155a0 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
155b0 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
155c0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
155d0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
155e0 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
155f0 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
15600 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
15610 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
15620 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
15630 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
15640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15650 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
15660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15670 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15690 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
156a0 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
156b0 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
156c0 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
156d0 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
156e0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
156f0 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
15700 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
15710 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
15720 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
15730 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
15740 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15750 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
15760 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
15770 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
15780 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
15790 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
157a0 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
157b0 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
157c0 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
157d0 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
157e0 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
157f0 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
15800 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
15810 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
15820 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
15830 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
15840 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
15850 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
15860 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
15870 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
15880 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
15890 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
158a0 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
158b0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
158c0 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
158d0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
158e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
158f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
15910 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
15920 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
15930 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
15940 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
15950 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
15960 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
15970 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
15980 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
15990 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
159a0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
159b0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
159c0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
159d0 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
159e0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
159f0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
15a00 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
15a10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
15a20 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
15a30 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
15a40 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
15a50 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
15a60 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
15a70 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
15a80 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
15a90 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
15aa0 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
15ab0 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
15ac0 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
15ad0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
15ae0 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
15af0 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
15b00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
15b10 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
15b20 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
15b30 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
15b40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
15b50 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
15b60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
15b70 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
15b80 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
15b90 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
15ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15bb0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
15bc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
15bd0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
15be0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15bf0 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
15c00 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b 41  ors(p);.  checkA
15c10 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
15c20 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69  ;..  /* No commi
15c30 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  t or rollback ne
15c40 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67  eded if the prog
15c50 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65  ram never starte
15c60 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a  d or if the.  **
15c70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64   SQL statement d
15c80 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20  oes not read or 
15c90 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65  write a database
15ca0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28   file.  */.  if(
15cb0 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e   p->pc>=0 && p->
15cc0 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20  bIsReader ){.   
15cd0 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50   int mrc;   /* P
15ce0 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64  rimary error cod
15cf0 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a  e from p->rc */.
15d00 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65      int eStateme
15d10 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ntOp = 0;.    in
15d20 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
15d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15d40 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  Set to true if a
15d50 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72   'special' error
15d60 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b   */..    /* Lock
15d70 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64   all btrees used
15d80 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
15d90 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
15da0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20  VdbeEnter(p);.. 
15db0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
15dc0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
15dd0 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
15de0 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
15df0 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69  xff;.    isSpeci
15e00 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53  alError = mrc==S
15e10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
15e20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
15e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15e40 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51        || mrc==SQ
15e50 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c  LITE_INTERRUPT |
15e60 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
15e70 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70  LL;.    if( isSp
15e80 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20  ecialError ){.  
15e90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
15ea0 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
15eb0 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  y and the error 
15ec0 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49  code is SQLITE_I
15ed0 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20  NTERRUPT, .     
15ee0 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20   ** no rollback 
15ef0 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74  is necessary. Ot
15f00 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73  herwise, at leas
15f10 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  t a savepoint . 
15f20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
15f30 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c  ion must be roll
15f40 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f  ed back to resto
15f50 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
15f60 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  to a .      ** c
15f70 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
15f80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15f90 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73  ** Even if the s
15fa0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64  tatement is read
15fb0 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70  -only, it is imp
15fc0 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72  ortant to perfor
15fd0 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61  m.      ** a sta
15fe0 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61  tement or transa
15ff0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f  ction rollback o
16000 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
16010 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a   error .      **
16020 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
16030 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
16040 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
16050 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
16060 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
16070 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
16080 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
16090 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
160a0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
160b0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
160c0 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
160d0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
160e0 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
160f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
16100 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
16110 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
16120 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
16130 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
16140 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
16150 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
16160 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
16170 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
16180 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
16190 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
161a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
161b0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
161c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
161d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
161e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
161f0 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
16200 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
16210 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
16220 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
16230 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
16240 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
16250 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
16260 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
16270 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
16280 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16290 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
162a0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
162b0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
162c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
162d0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
162e0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
162f0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
16300 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
16310 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
16320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16330 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
16340 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
16350 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
16360 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
16370 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16380 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
16390 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
163a0 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
163b0 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
163c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
163d0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
163e0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
163f0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
16400 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
16410 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
16420 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
16430 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
16440 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
16450 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
16460 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
16470 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
16480 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
16490 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
164a0 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
164b0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
164c0 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
164d0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
164e0 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
164f0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
16500 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
16510 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
16520 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
16530 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
16540 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
16550 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
16560 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16570 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
16580 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
16590 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
165a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
165b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
165c0 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
165d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
165e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
165f0 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
16600 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
16610 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16620 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
16630 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16640 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16670 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
16680 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
16690 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
166a0 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
166b0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
166c0 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
166d0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
166e0 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
166f0 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
16700 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
16710 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
16720 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
16730 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
16740 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
16750 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
16760 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
16770 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
16780 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
16790 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
167a0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
167b0 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
167c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
167d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
167e0 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
167f0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
16800 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
16810 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
16820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
16830 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
16840 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
16850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16860 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
16870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
16880 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
16890 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
168a0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
168b0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
168c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
168d0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
168e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
168f0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
16900 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
16910 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
16920 28 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66 65  (u64)SQLITE_Defe
16930 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
16940 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
16950 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
16960 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16980 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
16990 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
169a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  K);.        p->n
169b0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
169c0 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
169d0 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
169e0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
169f0 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
16a00 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16a10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
16a20 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
16a30 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
16a40 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
16a50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
16a60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
16a70 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
16a80 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
16a90 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
16aa0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
16ab0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
16ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
16ad0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
16ae0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
16af0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
16b00 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
16b10 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
16b20 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
16b30 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
16b40 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
16b50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
16b60 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
16b70 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
16b80 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
16b90 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
16ba0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
16bb0 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
16bc0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
16bd0 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
16be0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
16bf0 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
16c00 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
16c10 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
16c20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
16c30 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
16c40 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
16c50 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
16c60 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
16c70 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
16c80 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
16c90 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
16ca0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
16cb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
16cc0 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
16cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16ce0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
16cf0 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
16d00 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
16d10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
16d20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16d30 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
16d40 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
16d50 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
16d60 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
16d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
16d80 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
16d90 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
16da0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
16db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16dc0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
16dd0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
16de0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
16df0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16e00 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
16e10 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
16e20 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
16e30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
16e40 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
16e50 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
16e60 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
16e70 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
16e80 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
16e90 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
16ea0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
16eb0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
16ec0 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
16ed0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16ee0 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
16ef0 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
16f00 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
16f10 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
16f20 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
16f30 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
16f40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16f50 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
16f60 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
16f70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16f90 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
16fa0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
16fb0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
16fc0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
16fd0 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
16fe0 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
16ff0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
17000 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
17010 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
17020 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
17030 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
17040 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
17050 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
17060 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
17070 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
17080 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
17090 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
170a0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
170b0 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
170c0 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
170d0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
170e0 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
170f0 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
17100 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
17110 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
17120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
17130 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
17140 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
17150 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
17160 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
17170 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
17180 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17190 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
171a0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
171b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
171c0 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
171d0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
171e0 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
171f0 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
17200 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
17210 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
17220 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
17230 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
17240 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
17250 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
17260 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
17270 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
17280 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
17290 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
172a0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
172b0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
172c0 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
172d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
172e0 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c  >nVdbeActive>0 |
172f0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
17300 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
17310 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
17320 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
17330 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
17340 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
17350 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
17360 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
17370 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
17380 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
17390 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
173a0 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
173b0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
173c0 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
173d0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
173e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
173f0 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
17400 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
17410 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
17420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
17430 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  the error code a
17440 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
17450 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
17460 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a  e VDBE passed.**
17470 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
17480 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61  gument to its da
17490 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73  tabase handle (s
174a0 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
174b0 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   be .** returned
174c0 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   by calls to sql
174d0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61  ite3_errcode() a
174e0 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nd sqlite3_errms
174f0 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  g())..**.** This
17500 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
17510 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42  ot clear the VDB
17520 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20  E error code or 
17530 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a  message, just.**
17540 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20   copies them to 
17550 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
17560 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
17570 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
17580 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  rror(Vdbe *p){. 
17590 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
175a0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
175b0 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d   p->rc;.  if( p-
175c0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
175d0 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
175e0 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c++;.    sqlite3
175f0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
17600 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
17610 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
17620 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
17630 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
17640 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
17650 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
17660 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
17670 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
17680 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
17690 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
176a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
176b0 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d  ->bBenignMalloc-
176c0 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  -;.  }else if( d
176d0 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73  b->pErr ){.    s
176e0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e 75  qlite3ValueSetNu
176f0 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ll(db->pErr);.  
17700 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  }.  db->errCode 
17710 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72  = rc;.  return r
17720 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
17730 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
17740 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
17750 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
17760 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
17770 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
17780 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
17790 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
177a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
177b0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
177c0 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
177d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
177e0 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
177f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17800 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
17810 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
17820 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
17830 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
17840 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
17850 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
17860 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
17870 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
17880 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
17890 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
178a0 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
178b0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
178c0 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
178d0 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
178e0 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
178f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
17900 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
17910 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
17920 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
17930 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
17940 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
17950 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
17960 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
17970 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
17980 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
17990 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
179a0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
179b0 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
179c0 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
179d0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
179e0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
179f0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
17a00 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
17a10 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
17a20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
17a30 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
17a40 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
17a50 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
17a60 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
17a70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
17a80 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
17a90 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
17aa0 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
17ab0 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
17ac0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
17ad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17ae0 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
17af0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17b00 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
17b10 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
17b20 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
17b30 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 20 2a  dif..  sqlite3 *
17b40 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
17b50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
17b60 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
17b70 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
17b80 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
17b90 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
17ba0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
17bb0 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
17bc0 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
17bd0 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
17be0 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
17bf0 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
17c00 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
17c10 68 61 73 20 62 65 65 6e 20 72 75 6e 20 65 76 65  has been run eve
17c20 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
17c30 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
17c40 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
17c50 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
17c60 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
17c70 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
17c80 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
17c90 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
17ca0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
17cb0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
17cc0 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
17cd0 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
17ce0 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
17cf0 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
17d00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
17d10 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
17d20 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
17d30 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
17d40 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
17d50 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
17d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
17d70 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
17d80 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
17d90 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
17da0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
17db0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
17dc0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
17dd0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
17de0 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
17df0 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
17e00 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
17e10 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
17e20 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
17e30 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
17e40 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
17e50 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
17e60 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
17e70 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
17e80 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
17e90 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
17ea0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
17eb0 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
17ec0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
17ed0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  ->zErrMsg);.  }.
17ee0 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67 69  .  /* Reset regi
17ef0 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e  ster contents an
17f00 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72 20  d reclaim error 
17f10 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e 0a  message memory..
17f20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
17f30 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
17f40 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
17f50 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
17f60 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
17f70 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
17f80 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
17f90 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
17fa0 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
17fb0 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   up.  */.  if( p
17fc0 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
17fd0 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
17fe0 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
17ff0 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
18000 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
18010 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18020 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73  p->nMem; i++) as
18030 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
18040 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65  .flags==MEM_Unde
18050 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  fined );.  }.#en
18060 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
18070 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
18080 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
18090 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
180a0 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66 64  ultSet = 0;.#ifd
180b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
180c0 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30 3b    p->nWrite = 0;
180d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 61  .#endif..  /* Sa
180e0 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
180f0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
18100 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
18110 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
18120 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
18130 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
18140 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
18150 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
18160 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 66  ( out ){.      f
18170 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
18180 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
18190 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
181a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
181b0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
181c0 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
181d0 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
181e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
181f0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
18200 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
18210 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
18220 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
18230 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
18240 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
18250 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
18260 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
18270 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
18280 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
18290 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
182a0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
182b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
182c0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
182d0 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
182e0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
182f0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
18300 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
18310 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
18320 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
18330 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
18340 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18350 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
18360 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
18370 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
18380 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
18390 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
183a0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
183b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
183c0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
183d0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
183e0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
183f0 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
18400 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
18410 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
18420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18430 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
18440 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
18450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
18460 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
18470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
18480 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
18490 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75  IC_RESET;.  retu
184a0 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
184b0 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
184c0 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
184d0 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
184e0 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
184f0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
18500 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
18510 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
18520 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
18530 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
18540 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
18550 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
18560 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
18570 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18580 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
18590 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
185a0 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
185b0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
185c0 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
185d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
185e0 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
185f0 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
18600 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
18610 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
18620 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
18630 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
18640 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20  f parameter iOp 
18650 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
18660 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  o, then invoke t
18670 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
18680 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61  r.** all auxilia
18690 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
186a0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
186b0 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
186c0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72  ed as.** the fir
186d0 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
186e0 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73  ** Or, if iOp is
186f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
18700 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
18710 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63  then the destruc
18720 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69  tor is.** only i
18730 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65  nvoked for those
18740 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
18750 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64  pointers created
18760 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a   by the user .**
18770 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
18780 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63  d by the OP_Func
18790 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69  tion opcode at i
187a0 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f  nstruction iOp o
187b0 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20  f .** VM pVdbe, 
187c0 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66  and only then if
187d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
187e0 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63   associated func
187f0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69  tion parameter i
18800 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61  s the 32nd or la
18810 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a  ter (counting.**
18820 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20        from left 
18830 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a  to right), or.**
18840 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72  .**    * the cor
18850 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
18860 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20  n argument mask 
18870 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20  is clear (where 
18880 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20  the first.**    
18890 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d    function param
188a0 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  eter corresponds
188b0 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e   to bit 0 etc.).
188c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
188d0 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
188e0 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  a(sqlite3 *db, A
188f0 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74  uxData **pp, int
18900 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b   iOp, int mask){
18910 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
18920 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
18930 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
18940 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
18950 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d  | (pAux->iAuxOp=
18960 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20 26  =iOp.          &
18970 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e  & pAux->iAuxArg>
18980 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
18990 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 33  (pAux->iAuxArg>3
189a0 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
189b0 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
189c0 75 78 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b  uxArg)))).    ){
189d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
189e0 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d   pAux->iAuxArg==
189f0 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  31 );.      if( 
18a00 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75 78  pAux->xDeleteAux
18a10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
18a20 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41 75  ->xDeleteAux(pAu
18a30 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
18a40 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41  }.      *pp = pA
18a50 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20  ux->pNextAux;.  
18a60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18a70 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  e(db, pAux);.   
18a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
18a90 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41 75  = &pAux->pNextAu
18aa0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  x;.    }.  }.}..
18ab0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
18ac0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
18ad0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
18ae0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
18af0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
18b00 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
18b10 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
18b20 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
18b30 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
18b40 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
18b50 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
18b60 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
18b70 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
18b80 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
18b90 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
18ba0 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
18bb0 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
18bc0 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
18bd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18be0 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
18bf0 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
18c00 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18c10 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
18c20 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
18c30 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
18c40 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
18c50 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
18c60 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
18c70 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
18c80 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
18c90 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
18ca0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
18cb0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
18cc0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
18cd0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
18ce0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
18cf0 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
18d00 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
18d10 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
18d20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18d30 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
18d40 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
18d50 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
18d60 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
18d70 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
18d80 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c  ->nVar);.    sql
18d90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18da0 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pVList);.    s
18db0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18dc0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a   p->pFree);.  }.
18dd0 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
18de0 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
18df0 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
18e00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
18e10 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
18e20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
18e30 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  zSql);.#ifdef SQ
18e40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
18e50 41 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALIZE.  sqlite3D
18e60 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 6f  bFree(db, p->zNo
18e70 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20 20 20  rmSql);.  {.    
18e80 44 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 54 68  DblquoteStr *pTh
18e90 69 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  is, *pNext;.    
18ea0 66 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70 44 62  for(pThis=p->pDb
18eb0 6c 53 74 72 3b 20 70 54 68 69 73 3b 20 70 54 68  lStr; pThis; pTh
18ec0 69 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  is=pNext){.     
18ed0 20 70 4e 65 78 74 20 3d 20 70 54 68 69 73 2d 3e   pNext = pThis->
18ee0 70 4e 65 78 74 53 74 72 3b 0a 20 20 20 20 20 20  pNextStr;.      
18ef0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18f00 2c 20 70 54 68 69 73 29 3b 0a 20 20 20 20 7d 0a  , pThis);.    }.
18f10 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
18f20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18f30 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
18f40 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
18f50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
18f60 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20  >nScan; i++){.  
18f70 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18f80 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69  e(db, p->aScan[i
18f90 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
18fa0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18fb0 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b  e(db, p->aScan);
18fc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
18fd0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
18fe0 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
18ff0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
19000 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
19010 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
19020 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
19030 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
19040 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19050 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
19060 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
19070 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
19080 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66  ect(db, p);.  if
19090 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
190a0 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
190b0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
190c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
190d0 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
190e0 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
190f0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
19100 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
19110 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
19120 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
19130 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  v;.  }.  p->magi
19140 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
19150 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30  EAD;.  p->db = 0
19160 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
19170 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  eNN(db, p);.}../
19180 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
19190 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
191a0 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
191b0 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
191c0 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
191d0 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
191e0 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
191f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19200 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
19210 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
19220 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
19230 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
19240 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
19250 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
19260 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
19270 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
19280 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
19290 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
192a0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
192b0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
192c0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
192d0 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
192e0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
192f0 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
19300 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
19310 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  EE );.  rc = sql
19320 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
19330 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43  npacked(p->uc.pC
19340 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
19350 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
19360 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
19370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
19380 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
19390 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
193a0 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
193b0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
193c0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
193d0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
193e0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
193f0 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
19400 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
19410 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
19420 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19430 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
19440 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
19450 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
19460 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
19470 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
19480 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
19490 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
194a0 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
194b0 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
194c0 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
194d0 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
194e0 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
194f0 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
19500 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
19510 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
19520 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
19530 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
19540 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
19550 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
19560 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
19570 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
19580 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
19590 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
195a0 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
195b0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
195c0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
195d0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
195e0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
195f0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
19600 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75  ssert( p->uc.pCu
19610 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
19620 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
19630 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
19640 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
19650 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19660 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
19670 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  re(p->uc.pCursor
19680 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
19690 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
196a0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
196b0 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
196c0 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
196d0 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
196e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
196f0 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
19700 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
19710 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
19720 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
19730 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
19740 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
19750 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
19760 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
19770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
19780 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
19790 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
197a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
197b0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
197c0 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71  TREE );.  if( sq
197d0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
197e0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
197f0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
19800 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
19810 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
19820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
19840 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
19850 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
19860 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
19870 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
19880 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
19890 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
198a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
198b0 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
198c0 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
198d0 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
198e0 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
198f0 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
19900 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
19910 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
19920 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
19930 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
19940 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
19950 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
19960 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
19970 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
19980 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
19990 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
199a0 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
199b0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
199c0 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
199d0 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
199e0 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
199f0 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
19a00 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
19a10 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
19a20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
19a30 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
19a40 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
19a50 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
19a60 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
19a70 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
19a80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
19a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19aa0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
19ab0 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e  eCursor **pp, in
19ac0 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62  t *piCol){.  Vdb
19ad0 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70  eCursor *p = *pp
19ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
19af0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
19b00 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75  _BTREE || p->eCu
19b10 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50  rType==CURTYPE_P
19b20 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20 70  SEUDO );.  if( p
19b30 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
19b40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 70   ){.    int iMap
19b50 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c  ;.    if( p->aAl
19b60 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20  tMap && (iMap = 
19b70 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69  p->aAltMap[1+*pi
19b80 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20  Col])>0 ){.     
19b90 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75   *pp = p->pAltCu
19ba0 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69 43  rsor;.      *piC
19bb0 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20  ol = iMap - 1;. 
19bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19bd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
19be0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
19bf0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
19c00 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
19c10 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
19c20 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
19c30 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  sor) ){.    retu
19c40 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
19c50 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rsor(p);.  }.  r
19c60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
19c80 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
19c90 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
19ca0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
19cb0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
19cc0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
19cd0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
19ce0 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
19cf0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
19d00 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
19d10 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
19d20 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
19d30 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
19d40 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
19d50 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
19d60 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
19d70 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
19d80 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
19d90 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
19da0 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
19db0 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
19dc0 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
19dd0 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
19de0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
19df0 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
19e00 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
19e10 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
19e20 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
19e30 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
19e40 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
19e50 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
19e60 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
19e70 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
19e80 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
19e90 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
19ea0 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
19eb0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
19ec0 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
19ed0 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
19ee0 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
19ef0 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
19f00 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
19f10 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
19f20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
19f30 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
19f40 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
19f50 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
19f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
19f70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
19f80 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
19f90 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
19fa0 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
19fb0 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
19fc0 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
19fd0 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
19fe0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
19ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
1a000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
1a010 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
1a030 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
1a040 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
1a060 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
1a070 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
1a080 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
1a090 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
1a0a0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
1a0b0 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
1a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0d0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
1a0e0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
1a0f0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
1a100 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
1a110 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
1a120 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
1a150 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
1a160 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
1a180 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
1a190 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
1a1a0 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
1a1b0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
1a1c0 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
1a1d0 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
1a200 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
1a210 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
1a230 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
1a240 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
1a250 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
1a280 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
1a290 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
1a2a0 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
1a2b0 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
1a2c0 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
1a2d0 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
1a2e0 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
1a2f0 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
1a300 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
1a310 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
1a320 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
1a330 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
1a340 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
1a350 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
1a360 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
1a370 2a 2f 0a 0a 23 69 66 20 30 20 2f 2a 20 49 6e 6c  */..#if 0 /* Inl
1a380 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 4f 50  ined into the OP
1a390 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1a3a0 64 65 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  de */./*.** Retu
1a3b0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
1a3c0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
1a3d0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
1a3e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a3f0 69 6e 65 20 6d 69 67 68 74 20 63 6f 6e 76 65 72  ine might conver
1a400 74 20 61 20 6c 61 72 67 65 20 4d 45 4d 5f 49 6e  t a large MEM_In
1a410 74 52 65 61 6c 20 76 61 6c 75 65 20 69 6e 74 6f  tReal value into
1a420 20 4d 45 4d 5f 52 65 61 6c 2e 0a 2a 2a 0a 2a 2a   MEM_Real..**.**
1a430 20 32 30 31 39 2d 30 37 2d 31 31 3a 20 20 54 68   2019-07-11:  Th
1a440 65 20 70 72 69 6d 61 72 79 20 75 73 65 72 20 6f  e primary user o
1a450 66 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  f this subroutin
1a460 65 20 77 61 73 20 74 68 65 20 4f 50 5f 4d 61 6b  e was the OP_Mak
1a470 65 52 65 63 6f 72 64 0a 2a 2a 20 6f 70 63 6f 64  eRecord.** opcod
1a480 65 20 69 6e 20 74 68 65 20 62 79 74 65 2d 63 6f  e in the byte-co
1a490 64 65 20 65 6e 67 69 6e 65 2e 20 20 42 75 74 20  de engine.  But 
1a4a0 62 79 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 72  by moving this r
1a4b0 6f 75 74 69 6e 65 20 69 6e 2d 6c 69 6e 65 2c 20  outine in-line, 
1a4c0 77 65 0a 2a 2a 20 63 61 6e 20 6f 6d 69 74 20 73  we.** can omit s
1a4d0 6f 6d 65 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ome redundant te
1a4e0 73 74 73 20 61 6e 64 20 6d 61 6b 65 20 74 68 61  sts and make tha
1a4f0 74 20 6f 70 63 6f 64 65 20 61 20 6c 6f 74 20 66  t opcode a lot f
1a500 61 73 74 65 72 2e 20 20 53 6f 0a 2a 2a 20 74 68  aster.  So.** th
1a510 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
1a520 77 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  w only used by t
1a530 68 65 20 53 54 41 54 33 20 6c 6f 67 69 63 20 61  he STAT3 logic a
1a540 6e 64 20 53 54 41 54 33 20 73 75 70 70 6f 72 74  nd STAT3 support
1a550 20 68 61 73 0a 2a 2a 20 65 6e 64 65 64 2e 20 20   has.** ended.  
1a560 54 68 65 20 63 6f 64 65 20 69 73 20 6b 65 70 74  The code is kept
1a570 20 68 65 72 65 20 66 6f 72 20 68 69 73 74 6f 72   here for histor
1a580 69 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 6f  ical reference o
1a590 6e 6c 79 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  nly..*/.u32 sqli
1a5a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1a5b0 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
1a5c0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
1a5d0 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
1a5e0 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
1a5f0 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
1a600 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
1a610 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
1a620 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1a630 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
1a640 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a650 66 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  f( flags&(MEM_In
1a660 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29  t|MEM_IntReal) )
1a670 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
1a680 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
1a690 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
1a6a0 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
1a6b0 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
1a6c0 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
1a6d0 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
1a6e0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
1a6f0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
1a700 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1a710 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
1a720 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1a730 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65  lags & MEM_IntRe
1a740 61 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  al );.    if( i<
1a750 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e  0 ){.      u = ~
1a760 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1a770 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
1a780 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
1a790 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26  ){.      if( (i&
1a7a0 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
1a7b0 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20  rmat>=4 ){.     
1a7c0 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
1a7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
1a7e0 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c  u32)u;.      }el
1a7f0 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65  se{.        *pLe
1a800 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  n = 1;.        r
1a810 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1a820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
1a830 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e  <=32767 ){ *pLen
1a840 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20   = 2; return 2; 
1a850 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  }.    if( u<=838
1a860 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  8607 ){ *pLen = 
1a870 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20  3; return 3; }. 
1a880 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
1a890 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  3647 ){ *pLen = 
1a8a0 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20  4; return 4; }. 
1a8b0 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
1a8c0 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36  YTE ){ *pLen = 6
1a8d0 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20  ; return 5; }.  
1a8e0 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
1a8f0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
1a900 6e 74 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  ntReal ){.      
1a910 2f 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  /* If the value 
1a920 69 73 20 49 6e 74 52 65 61 6c 20 61 6e 64 20 69  is IntReal and i
1a930 73 20 67 6f 69 6e 67 20 74 6f 20 74 61 6b 65 20  s going to take 
1a940 75 70 20 38 20 62 79 74 65 73 20 74 6f 20 73 74  up 8 bytes to st
1a950 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ore.      ** as 
1a960 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  an integer, then
1a970 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   we might as wel
1a980 6c 20 6d 61 6b 65 20 69 74 20 61 6e 20 38 2d 62  l make it an 8-b
1a990 79 74 65 20 66 6c 6f 61 74 69 6e 67 0a 20 20 20  yte floating.   
1a9a0 20 20 20 2a 2a 20 70 6f 69 6e 74 20 76 61 6c 75     ** point valu
1a9b0 65 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e */.      pMem-
1a9c0 3e 75 2e 72 20 3d 20 28 64 6f 75 62 6c 65 29 70  >u.r = (double)p
1a9d0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Mem->u.i;.      
1a9e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pMem->flags &= ~
1a9f0 4d 45 4d 5f 49 6e 74 52 65 61 6c 3b 0a 20 20 20  MEM_IntReal;.   
1aa00 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c     pMem->flags |
1aa10 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
1aa20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 20 20    return 7;.    
1aa30 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  }.    return 6;.
1aa40 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
1aa50 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1aa60 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
1aa70 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
1aa80 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
1aa90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1aaa0 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
1aab0 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
1aac0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
1aad0 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
1aae0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
1aaf0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1ab00 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
1ab10 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
1ab20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
1ab30 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
1ab40 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
1ab50 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 23 65 6e 64  tr)!=0));.}.#end
1ab60 69 66 20 2f 2a 20 69 6e 6c 69 6e 65 64 20 69 6e  if /* inlined in
1ab70 74 6f 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  to OP_MakeRecord
1ab80 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73   */../*.** The s
1ab90 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20  izes for serial 
1aba0 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20  types less than 
1abb0 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  128.*/.static co
1abc0 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
1abd0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
1abe0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30   {.        /*  0
1abf0 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34     1   2   3   4
1ac00 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38     5   6   7   8
1ac10 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20     9 */   ./*   
1ac20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32  0 */   0,  1,  2
1ac30 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38  ,  3,  4,  6,  8
1ac40 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  8,  0,  0,./*
1ac50 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c    10 */   0,  0,
1ac60 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c    0,  0,  1,  1,
1ac70 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c    2,  2,  3,  3,
1ac80 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20  ./*  20 */   4, 
1ac90 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20   4,  5,  5,  6, 
1aca0 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20   6,  7,  7,  8, 
1acb0 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20   8,./*  30 */   
1acc0 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31  9,  9, 10, 10, 1
1acd0 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31  1, 11, 12, 12, 1
1ace0 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f  3, 13,./*  40 */
1acf0 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35    14, 14, 15, 15
1ad00 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37  , 16, 16, 17, 17
1ad10 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30  , 18, 18,./*  50
1ad20 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c   */  19, 19, 20,
1ad30 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c   20, 21, 21, 22,
1ad40 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20   22, 23, 23,./* 
1ad50 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20   60 */  24, 24, 
1ad60 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20  25, 25, 26, 26, 
1ad70 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a  27, 27, 28, 28,.
1ad80 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32  /*  70 */  29, 2
1ad90 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33  9, 30, 30, 31, 3
1ada0 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33  1, 32, 32, 33, 3
1adb0 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34  3,./*  80 */  34
1adc0 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36  , 34, 35, 35, 36
1add0 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38  , 36, 37, 37, 38
1ade0 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20  , 38,./*  90 */ 
1adf0 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c   39, 39, 40, 40,
1ae00 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c   41, 41, 42, 42,
1ae10 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20   43, 43,./* 100 
1ae20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20  */  44, 44, 45, 
1ae30 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20  45, 46, 46, 47, 
1ae40 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31  47, 48, 48,./* 1
1ae50 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35  10 */  49, 49, 5
1ae60 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35  0, 50, 51, 51, 5
1ae70 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f  2, 52, 53, 53,./
1ae80 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34  * 120 */  54, 54
1ae90 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36  , 55, 55, 56, 56
1aea0 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a  , 57, 57.};../*.
1aeb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
1aec0 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
1aed0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1aee0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
1aef0 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
1af00 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1af10 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
1af20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1af30 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1af40 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75  =128 ){.    retu
1af50 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
1af60 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
1af70 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69      assert( seri
1af80 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20  al_type<12 .    
1af90 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
1afa0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1afb0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28  [serial_type]==(
1afc0 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1afd0 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72  )/2 );.    retur
1afe0 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
1aff0 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
1b000 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73  ype];.  }.}.u8 s
1b010 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74  qlite3VdbeOneByt
1b020 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
1b030 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  8 serial_type){.
1b040 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
1b050 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72  _type<128 );.  r
1b060 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
1b070 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1b080 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f  al_type];  .}../
1b090 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
1b0a0 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
1b0b0 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
1b0c0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
1b0d0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
1b0e0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
1b0f0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
1b100 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
1b110 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
1b120 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
1b130 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
1b140 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
1b150 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
1b160 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
1b170 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
1b180 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
1b190 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
1b1a0 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
1b1b0 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
1b1c0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
1b1d0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
1b1e0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
1b1f0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
1b200 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
1b210 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
1b220 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
1b230 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
1b240 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
1b250 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
1b260 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
1b270 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
1b280 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1b290 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
1b2a0 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
1b2b0 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
1b2c0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
1b2d0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
1b2e0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
1b2f0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
1b300 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
1b310 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
1b320 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
1b330 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
1b340 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
1b350 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
1b360 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
1b370 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
1b380 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
1b390 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
1b3a0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
1b3b0 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
1b3c0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
1b3d0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
1b3e0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
1b3f0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
1b400 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
1b410 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
1b420 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
1b430 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
1b440 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
1b450 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
1b460 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
1b470 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
1b480 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
1b490 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
1b4a0 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
1b4b0 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
1b4c0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
1b4d0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
1b4e0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
1b4f0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
1b500 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
1b510 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
1b520 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
1b530 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
1b540 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
1b550 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
1b560 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
1b570 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
1b580 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
1b590 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
1b5a0 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
1b5b0 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
1b5c0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
1b5d0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
1b5e0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
1b5f0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
1b600 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
1b610 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
1b620 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
1b630 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
1b640 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
1b650 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
1b660 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
1b670 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
1b680 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
1b690 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
1b6a0 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
1b6b0 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
1b6c0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
1b6d0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
1b6e0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
1b6f0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
1b700 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
1b710 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
1b720 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
1b730 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
1b740 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
1b750 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
1b760 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
1b770 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
1b780 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
1b790 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
1b7a0 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
1b7b0 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
1b7c0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
1b7d0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
1b7e0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
1b7f0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
1b800 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
1b810 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1b820 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
1b830 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
1b840 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
1b850 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
1b860 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
1b870 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
1b880 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
1b890 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1b8a0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1b8b0 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
1b8c0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
1b8d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b8e0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1b8f0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
1b900 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
1b910 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
1b920 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
1b930 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1b940 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
1b950 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
1b960 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
1b970 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
1b980 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
1b990 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
1b9a0 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
1b9b0 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
1b9c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1b9d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1b9e0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
1b9f0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
1ba00 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
1ba10 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
1ba20 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
1ba30 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
1ba40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
1ba50 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
1ba60 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
1ba70 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
1ba80 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1ba90 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
1baa0 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
1bab0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
1bac0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
1bad0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
1bae0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
1baf0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
1bb00 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
1bb10 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
1bb20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
1bb30 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1bb40 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1bb50 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
1bb60 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
1bb70 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
1bb80 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
1bb90 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
1bba0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
1bbb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bbc0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
1bbd0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
1bbe0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d   = i = sqlite3Sm
1bbf0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
1bc00 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61  ial_type];.    a
1bc10 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
1bc20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b    do{.      buf[
1bc30 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  --i] = (u8)(v&0x
1bc40 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
1bc50 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   8;.    }while( 
1bc60 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  i );.    return 
1bc70 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
1bc80 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
1bc90 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
1bca0 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
1bcb0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
1bcc0 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
1bcd0 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
1bce0 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20  u.nZero:0).     
1bcf0 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29          == (int)
1bd00 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bd10 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1bd20 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e  type) );.    len
1bd30 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
1bd40 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63  if( len>0 ) memc
1bd50 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
1bd60 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72   len);.    retur
1bd70 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
1bd80 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e   NULL or constan
1bd90 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72  ts 0 or 1 */.  r
1bda0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49  eturn 0;.}../* I
1bdb0 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65  nput "x" is a se
1bdc0 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e  quence of unsign
1bdd0 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68  ed characters th
1bde0 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a  at represent a.*
1bdf0 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  * big-endian int
1be00 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  eger.  Return th
1be10 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74  e equivalent nat
1be20 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23  ive integer.*/.#
1be30 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f  define ONE_BYTE_
1be40 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28  INT(x)    ((i8)(
1be50 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[0]).#define T
1be60 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  WO_BYTE_INT(x)  
1be70 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b    (256*(i8)((x)[
1be80 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66  0])|(x)[1]).#def
1be90 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49  ine THREE_BYTE_I
1bea0 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69  NT(x)  (65536*(i
1beb0 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
1bec0 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23  1]<<8)|(x)[2]).#
1bed0 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
1bee0 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32  _UINT(x)  (((u32
1bef0 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78  )(x)[0]<<24)|((x
1bf00 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1bf10 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64  ]<<8)|(x)[3]).#d
1bf20 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1bf30 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36  INT(x) (16777216
1bf40 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
1bf50 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
1bf60 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a  2]<<8)|(x)[3])..
1bf70 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
1bf80 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
1bf90 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
1bfa0 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
1bfb0 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
1bfc0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1bfd0 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
1bfe0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1bff0 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
1c000 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1c010 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1c020 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61  ed as two separa
1c030 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  te routines for 
1c040 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
1c050 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68  The few cases th
1c060 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c  at require local
1c070 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62   variables are b
1c080 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61  roken out into a
1c090 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75   separate.** rou
1c0a0 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20  tine so that in 
1c0b0 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f  most cases the o
1c0c0 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e  verhead of movin
1c0d0 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e  g the stack poin
1c0e0 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65  ter.** is avoide
1c0f0 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33  d..*/ .static u3
1c100 32 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63  2 serialGet(.  c
1c110 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c120 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
1c130 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
1c140 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
1c150 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c170 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
1c180 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
1c190 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1b0 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
1c1c0 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
1c1d0 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20  o */.){.  u64 x 
1c1e0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1c1f0 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d  (buf);.  u32 y =
1c200 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1c210 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78  buf+4);.  x = (x
1c220 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28  <<32) + y;.  if(
1c230 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
1c240 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
1c250 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35  CE-OF: R-29851-5
1c260 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20  2272 Value is a 
1c270 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69  big-endian 64-bi
1c280 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f  t.    ** twos-co
1c290 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1c2a0 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  . */.    pMem->u
1c2b0 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
1c2c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c2d0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
1c2e0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1c2f0 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
1c300 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1c310 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31  -OF: R-57343-491
1c320 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  14 Value is a bi
1c330 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35  g-endian IEEE 75
1c340 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20  4-2008 64-bit.  
1c350 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
1c360 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23  int number. */.#
1c370 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
1c380 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
1c390 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
1c3a0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20  TING_POINT).    
1c3b0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
1c3c0 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
1c3d0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1c3e0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
1c3f0 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72     ** byte order
1c400 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53  .  Or, that if S
1c410 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
1c420 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69  AN_64BIT_FLOAT i
1c430 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64  s.    ** defined
1c440 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
1c450 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
1c460 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
1c470 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61  xed.    ** endia
1c480 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n..    */.    st
1c490 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
1c4a0 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
1c4b0 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73  0000)<<32;.    s
1c4c0 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
1c4d0 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
1c4e0 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20   u64 t2 = t1;.  
1c4f0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
1c500 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
1c510 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72  assert( sizeof(r
1c520 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26  1)==sizeof(t2) &
1c530 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74  & memcmp(&r1, &t
1c540 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d  2, sizeof(r1))==
1c550 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 );.#endif.    
1c560 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
1c570 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
1c580 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a  Mem->u.r)==8 );.
1c590 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1c5a0 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
1c5b0 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75   memcpy(&pMem->u
1c5c0 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  .r, &x, sizeof(x
1c5d0 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ));.    pMem->fl
1c5e0 61 67 73 20 3d 20 49 73 4e 61 4e 28 78 29 20 3f  ags = IsNaN(x) ?
1c5f0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
1c600 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
1c610 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
1c620 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1c630 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
1c640 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
1c650 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
1c660 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
1c670 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
1c680 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
1c690 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1c6a0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
1c6b0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
1c6e0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
1c6f0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
1c700 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1c710 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1c720 30 3a 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c  0: { /* Internal
1c730 20 75 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20   use only: NULL 
1c740 77 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62  with virtual tab
1c750 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  le.             
1c760 20 20 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63    ** UPDATE no-c
1c770 68 61 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a  hange flag set *
1c780 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
1c790 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d  ags = MEM_Null|M
1c7a0 45 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70  EM_Zero;.      p
1c7b0 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20  Mem->n = 0;.    
1c7c0 20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20    pMem->u.nZero 
1c7d0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1c7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c7f0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
1c800 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
1c810 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
1c820 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20   {  /* Null */. 
1c830 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c840 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33  -OF: R-24078-093
1c850 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55  75 Value is a NU
1c860 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  LL. */.      pMe
1c870 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
1c880 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
1c890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c8a0 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45   1: {.      /* E
1c8b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
1c8c0 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20  885-25196 Value 
1c8d0 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73  is an 8-bit twos
1c8e0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20  -complement.    
1c8f0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f    ** integer. */
1c900 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c910 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
1c920 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1c930 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c940 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c950 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c960 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1c970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c980 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1c990 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c9a0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c9b0 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d  NCE-OF: R-49794-
1c9c0 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61  35026 Value is a
1c9d0 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62   big-endian 16-b
1c9e0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1c9f0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1ca00 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1ca10 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
1ca20 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1ca30 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1ca40 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1ca50 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1ca60 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1ca70 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
1ca80 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
1ca90 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
1caa0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1cab0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1cac0 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c  -37839-54301 Val
1cad0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1cae0 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20  an 24-bit.      
1caf0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1cb00 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1cb10 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1cb20 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1cb30 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1cb40 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1cb50 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1cb60 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1cb70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
1cb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1cb90 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1cba0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1cbb0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1cbc0 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d  NCE-OF: R-01849-
1cbd0 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61  26079 Value is a
1cbe0 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
1cbf0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1cc00 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1cc10 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1cc20 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1cc30 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69  YTE_INT(buf);.#i
1cc40 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20  fdef __HP_cc .  
1cc50 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75      /* Work arou
1cc60 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73  nd a sign-extens
1cc70 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48  ion bug in the H
1cc80 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48  P compiler for H
1cc90 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66  P/UX */.      if
1cca0 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20  ( buf[0]&0x80 ) 
1ccb0 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66  pMem->u.i |= 0xf
1ccc0 66 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c  fffffff80000000L
1ccd0 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  L;.#endif.      
1cce0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1ccf0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1cd00 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1cd10 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1cd20 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
1cd30 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1cd40 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1cd50 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1cd60 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30  VIDENCE-OF: R-50
1cd70 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20  385-09674 Value 
1cd80 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1cd90 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  48-bit.      ** 
1cda0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1cdb0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1cdc0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
1cdd0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1cde0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1cdf0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1ce00 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1ce10 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1ce20 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1ce30 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1ce40 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1ce50 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
1ce60 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
1ce70 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1ce80 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
1ce90 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
1cea0 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
1ceb0 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c    /* These use l
1cec0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20  ocal variables, 
1ced0 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20  so do them in a 
1cee0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
1cef0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  .      ** to avo
1cf00 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76  id having to mov
1cf10 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e  e the frame poin
1cf20 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ter in the commo
1cf30 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  n case */.      
1cf40 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74  return serialGet
1cf50 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65  (buf,serial_type
1cf60 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ,pMem);.    }.  
1cf70 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
1cf80 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
1cf90 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
1cfa0 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
1cfb0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1cfc0 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20  : R-12976-22893 
1cfd0 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
1cfe0 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20  eger 0. */.     
1cff0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1d000 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56   R-18143-12121 V
1d010 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1d020 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 1. */.      
1d030 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
1d040 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
1d050 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1d060 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
1d070 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1d080 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1d090 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1d0a0 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34  F: R-14606-31564
1d0b0 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42   Value is a BLOB
1d0c0 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f   that is (N-12)/
1d0d0 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20  2 bytes in.     
1d0e0 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20   ** length..    
1d0f0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1d100 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20  : R-28401-00140 
1d110 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  Value is a strin
1d120 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e  g in the text en
1d130 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  coding and.     
1d140 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74   ** (N-13)/2 byt
1d150 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f  es in length. */
1d160 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
1d170 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
1d180 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
1d190 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
1d1a0 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
1d1b0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
1d1c0 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
1d1d0 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
1d1e0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
1d1f0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1d200 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
1d210 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
1d220 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
1d230 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d240 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
1d250 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1d260 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
1d270 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
1d280 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
1d290 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
1d2a0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1d2b0 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
1d2c0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1d2d0 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
1d2e0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d2f0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1d300 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1d310 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
1d320 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
1d330 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
1d340 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1d350 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
1d360 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
1d370 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
1d380 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
1d390 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
1d3a0 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
1d3b0 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
1d3c0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
1d3d0 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
1d3e0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1d3f0 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
1d400 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
1d410 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
1d420 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1d430 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
1d440 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
1d450 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
1d460 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
1d470 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
1d480 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
1d490 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
1d4a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1d4b0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
1d4c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
1d4d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1d4e0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
1d4f0 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
1d500 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
1d510 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1d520 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 20 20  Info            
1d530 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1d540 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
1d550 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
1d560 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
1d570 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
1d580 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
1d590 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  turn */.  int nB
1d5a0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1d5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d5c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
1d5d0 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
1d5e0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
1d5f0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1d600 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
1d610 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
1d620 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a  ->nKeyField+1);.
1d630 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
1d640 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
1d650 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
1d660 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
1d670 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
1d680 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20  rn 0;.  p->aMem 
1d690 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
1d6a0 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
1d6b0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1d6c0 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ))];.  assert( p
1d6d0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1d6e0 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70  der!=0 );.  p->p
1d6f0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1d700 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
1d710 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  = pKeyInfo->nKey
1d720 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74  Field + 1;.  ret
1d730 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1d740 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
1d750 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
1d760 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
1d770 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  [], populate the
1d780 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63   .** UnpackedRec
1d790 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e  ord structure in
1d7a0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
1d7b0 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77  ourth argument w
1d7c0 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ith the.** conte
1d7d0 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64  nts of the decod
1d7e0 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76  ed record..*/ .v
1d7f0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
1d800 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
1d810 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1d820 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
1d830 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
1d840 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
1d850 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
1d860 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1d870 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
1d880 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
1d890 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
1d8a0 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
1d8b0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61  record */.  Unpa
1d8c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20  ckedRecord *p   
1d8d0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
1d8e0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65  his structure be
1d8f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
1d900 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
1d910 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1d920 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
1d930 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
1d940 0a 20 20 75 33 32 20 64 3b 20 0a 20 20 75 33 32  .  u32 d; .  u32
1d950 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d970 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d  Offset in aKey[]
1d980 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1d990 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1d9c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1d9d0 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
1d9e0 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65  m *pMem = p->aMe
1d9f0 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74  m;..  p->default
1da00 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  _rc = 0;.  asser
1da10 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1da20 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
1da30 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1da40 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1da50 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
1da60 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
1da70 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64  ( idx<szHdr && d
1da80 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 7b 0a 20  <=(u32)nKey ){. 
1da90 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1daa0 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
1dab0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1dac0 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
1dad0 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
1dae0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1daf0 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
1db00 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1db10 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
1db20 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
1db30 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1db40 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
1db50 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
1db60 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
1db70 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
1db80 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
1db90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1dba0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
1dbb0 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
1dbc0 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
1dbd0 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e   if( (++u)>=p->n
1dbe0 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
1dbf0 20 7d 0a 20 20 69 66 28 20 64 3e 28 75 33 32 29   }.  if( d>(u32)
1dc00 6e 4b 65 79 20 26 26 20 75 20 29 7b 0a 20 20 20  nKey && u ){.   
1dc10 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1dc20 5f 44 42 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  _DB );.    /* In
1dc30 20 61 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72   a corrupt recor
1dc40 64 20 65 6e 74 72 79 2c 20 74 68 65 20 6c 61 73  d entry, the las
1dc50 74 20 70 4d 65 6d 20 6d 69 67 68 74 20 68 61 76  t pMem might hav
1dc60 65 20 62 65 65 6e 20 73 65 74 20 75 70 20 75 73  e been set up us
1dc70 69 6e 67 20 0a 20 20 20 20 2a 2a 20 75 6e 69 6e  ing .    ** unin
1dc80 69 74 69 61 6c 69 7a 65 64 20 6d 65 6d 6f 72 79  itialized memory
1dc90 2e 20 4f 76 65 72 77 72 69 74 65 20 69 74 73 20  . Overwrite its 
1dca0 76 61 6c 75 65 20 77 69 74 68 20 4e 55 4c 4c 2c  value with NULL,
1dcb0 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20   to prevent.    
1dcc0 2a 2a 20 77 61 72 6e 69 6e 67 73 20 66 72 6f 6d  ** warnings from
1dcd0 20 4d 53 41 4e 2e 20 2a 2f 0a 20 20 20 20 73 71   MSAN. */.    sq
1dce0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
1dcf0 75 6c 6c 28 70 4d 65 6d 2d 31 29 3b 0a 20 20 7d  ull(pMem-1);.  }
1dd00 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
1dd10 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1dd20 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
1dd30 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66  ield = u;.}..#if
1dd40 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1dd50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1dd60 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
1dd70 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
1dd80 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
1dd90 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
1dda0 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
1ddb0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1ddc0 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
1ddd0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
1dde0 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
1ddf0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1de00 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
1de10 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
1de20 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
1de30 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
1de40 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1de50 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
1de60 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
1de70 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1de80 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
1de90 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
1dea0 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
1deb0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1dec0 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
1ded0 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
1dee0 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
1def0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1df00 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
1df10 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
1df20 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1df30 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
1df40 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1df50 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
1df60 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
1df70 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1df80 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1df90 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1dfa0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1dfb0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1dfc0 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1dfd0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1dfe0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1dff0 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
1e000 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
1e010 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
1e020 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
1e030 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
1e040 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1e050 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1e060 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
1e070 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1e080 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1e090 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1e0a0 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
1e0b0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1e0c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e0d0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
1e0e0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
1e0f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
1e100 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1e110 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1e120 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1e130 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1e140 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1e150 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
1e160 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
1e170 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1e180 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1e190 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1e1a0 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
1e1b0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1e1c0 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1e1d0 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
1e1e0 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
1e1f0 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
1e200 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
1e210 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
1e220 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
1e230 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1e240 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1e250 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1e260 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
1e270 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
1e280 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
1e290 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
1e2a0 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
1e2b0 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
1e2c0 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
1e2d0 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
1e2e0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
1e2f0 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
1e300 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
1e310 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
1e320 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
1e330 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
1e340 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
1e350 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
1e360 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
1e370 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
1e380 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
1e390 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
1e3a0 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
1e3b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
1e3c0 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
1e3d0 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
1e3e0 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
1e3f0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
1e400 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
1e410 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
1e420 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1e430 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
1e440 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
1e450 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
1e460 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
1e470 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
1e480 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1e490 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1e4a0 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31  1);.  if( szHdr1
1e4b0 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20  >98307 ) return 
1e4c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
1e4d0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1e4e0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1e4f0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
1e500 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
1e510 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1e520 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1e530 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1e540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1e550 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1e560 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1e570 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1e580 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1e590 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1e5a0 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
1e5b0 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
1e5c0 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
1e5d0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
1e5e0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
1e5f0 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
1e600 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
1e610 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
1e620 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
1e630 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
1e640 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20  nough key space 
1e650 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f  remaining to avo
1e660 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  id.    ** a buff
1e670 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68  er overread.  Th
1e680 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  e "d1+serial_typ
1e690 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73  e1+2" subexpress
1e6a0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1e6b0 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65  always be greate
1e6c0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1e6d0 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  to the amount of
1e6e0 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70   required key sp
1e6f0 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20  ace..    ** Use 
1e700 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69  that approximati
1e710 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  on to avoid the 
1e720 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63  more expensive c
1e730 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
1e740 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1e750 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20  ypeLen() in the 
1e760 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20  common case..   
1e770 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 28   */.    if( d1+(
1e780 75 36 34 29 73 65 72 69 61 6c 5f 74 79 70 65 31  u64)serial_type1
1e790 2b 32 3e 28 75 36 34 29 6e 4b 65 79 31 0a 20 20  +2>(u64)nKey1.  
1e7a0 20 20 20 26 26 20 64 31 2b 28 75 36 34 29 73 71     && d1+(u64)sq
1e7b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1e7c0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1e7d0 70 65 31 29 3e 28 75 36 34 29 6e 4b 65 79 31 20  pe1)>(u64)nKey1 
1e7e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
1e7f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1e800 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1e810 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
1e820 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
1e830 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1e840 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1e850 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1e860 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
1e870 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
1e880 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
1e890 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
1e8a0 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
1e8b0 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
1e8c0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
1e8e0 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
1e8f0 64 3e 69 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e  d>i ? pKeyInfo->
1e900 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20  aColl[i] : 0);. 
1e910 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1e920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1e930 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1e940 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1e950 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1e960 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1e970 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1e980 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1e990 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
1e9a0 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
1e9b0 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
1e9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1e9d0 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
1e9e0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
1e9f0 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
1ea00 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
1ea10 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
1ea20 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1ea30 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1ea40 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1ea50 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1ea60 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1ea70 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1ea80 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1ea90 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1eaa0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1eab0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1eac0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1ead0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1eae0 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
1eaf0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1eb00 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1eb10 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1eb20 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
1eb30 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1eb40 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1eb50 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1eb60 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1eb70 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1eb80 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1eb90 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1eba0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
1ebb0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1ebc0 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
1ebd0 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
1ebe0 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
1ebf0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1ec00 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1ec10 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
1ec20 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1ec30 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
1ec40 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
1ec50 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
1ec60 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
1ec70 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1ec80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ec90 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
1eca0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1ecb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ecc0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
1ecd0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1ece0 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
1ecf0 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
1ed00 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
1ed10 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
1ed20 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1ed30 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
1ed40 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1ed50 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
1ed60 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
1ed70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a  ->nAllField..**.
1ed80 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74  ** If this const
1ed90 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74  raint is not sat
1eda0 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73  isfied, it means
1edb0 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73   that the high-s
1edc0 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f  peed.** vdbeReco
1edd0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1ede0 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nd vdbeRecordCom
1edf0 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75  pareString() rou
1ee00 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  tines will.** no
1ee10 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1ee20 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72  .  If this asser
1ee30 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20  t() ever fires, 
1ee40 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e  it probably mean
1ee50 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65  s.** that the Ke
1ee60 79 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20  yInfo.nKeyField 
1ee70 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46  or KeyInfo.nAllF
1ee80 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65  ield values were
1ee90 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63   computed.** inc
1eea0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
1eeb0 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73  tic void vdbeAss
1eec0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1eed0 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74  hinLimits(.  int
1eee0 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69   nKey, const voi
1eef0 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  d *pKey,   /* Th
1ef00 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69  e record to veri
1ef10 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b  fy */ .  const K
1ef20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1ef30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1ef40 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73  e size with this
1ef50 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20   KeyInfo */.){. 
1ef60 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b   int nField = 0;
1ef70 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1ef80 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e  u32 idx;.  u32 n
1ef90 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20  otUsed;.  const 
1efa0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1efb0 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1efc0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79  igned char*)pKey
1efd0 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ;..  if( CORRUPT
1efe0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _DB ) return;.  
1eff0 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1f000 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1f010 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d    assert( nKey>=
1f020 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1f030 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20  zHdr<=(u32)nKey 
1f040 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  );.  while( idx<
1f050 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78  szHdr ){.    idx
1f060 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1f070 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65  aKey+idx, notUse
1f080 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b  d);.    nField++
1f090 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f0a0 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e  nField <= pKeyIn
1f0b0 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b  fo->nAllField );
1f0c0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1f0d0 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  e vdbeAssertFiel
1f0e0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1f0f0 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66  ts(A,B,C).#endif
1f100 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
1f110 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
1f120 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
1f130 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
1f140 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
1f150 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1f160 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
1f170 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
1f180 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1f190 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1f1a0 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
1f1b0 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1f1c0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1f1d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1f1e0 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
1f1f0 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
1f200 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
1f210 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
1f220 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
1f230 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
1f240 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
1f250 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1f260 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1f270 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
1f280 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
1f290 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2b0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
1f2c0 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
1f2d0 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
1f2e0 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
1f2f0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
1f300 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
1f310 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
1f320 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
1f330 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
1f340 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
1f350 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
1f360 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
1f370 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
1f380 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
1f390 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
1f3a0 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
1f3b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1f3c0 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
1f3d0 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
1f3e0 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
1f3f0 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69  Mem c2;.    sqli
1f400 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1f410 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c1, pMem1->db, M
1f420 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1f430 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1f440 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c2, pMem1->db,
1f450 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1f460 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1f470 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
1f480 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
1f490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f4a0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1f4b0 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
1f4c0 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
1f4d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1f4e0 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1f4f0 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
1f500 63 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  c);.    v2 = sql
1f510 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1f520 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1f530 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  2, pColl->enc);.
1f540 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1f550 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20  | v2==0) ){.    
1f560 20 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a    if( prcErr ) *
1f570 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f  prcErr = SQLITE_
1f580 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1f590 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
1f5a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f5b0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1f5c0 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20  l->pUser, c1.n, 
1f5d0 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20  v1, c2.n, v2);. 
1f5e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f5f0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1f600 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1f610 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1f620 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  c2);.    return 
1f630 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1f640 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62   The input pBlob
1f650 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1f660 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74  o be a Blob that
1f670 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a   is not marked.*
1f680 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e  * with MEM_Zero.
1f690 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
1f6a0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a   it could be a z
1f6b0 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61  ero-blob..*/.sta
1f6c0 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72  tic int isAllZer
1f6d0 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  o(const char *z,
1f6e0 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
1f6f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1f700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1f710 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  z[i] ) return 0;
1f720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
1f730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1f740 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65  e two blobs.  Re
1f750 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1f760 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1f770 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   if the first.**
1f780 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1f790 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1f7a0 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1f7b0 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ond, respectivel
1f7c0 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f  y..** If one blo
1f7d0 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  b is a prefix of
1f7e0 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e   the other, then
1f7f0 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20   the shorter is 
1f800 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53  the lessor..*/.S
1f810 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
1f820 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
1f830 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1f840 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
1f850 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  *pB2){.  int c;.
1f860 20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e    int n1 = pB1->
1f870 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42  n;.  int n2 = pB
1f880 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  2->n;..  /* It i
1f890 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61  s possible to ha
1f8a0 76 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20  ve a Blob value 
1f8b0 74 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f  that has some no
1f8c0 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20  n-zero content. 
1f8d0 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1f8e0 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42  zero content.  B
1f8f0 75 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d  ut that only com
1f900 65 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20  es up for Blobs 
1f910 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74  formed.  ** by t
1f920 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1f930 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63   opcode, and suc
1f940 68 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65  h Blobs never ge
1f950 74 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  t passed into.  
1f960 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  ** sqlite3MemCom
1f970 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73  pare(). */.  ass
1f980 65 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73  ert( (pB1->flags
1f990 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1f9a0 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73  || n1==0 );.  as
1f9b0 73 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67  sert( (pB2->flag
1f9c0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1f9d0 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20   || n2==0 );..  
1f9e0 69 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c  if( (pB1->flags|
1f9f0 70 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45  pB2->flags) & ME
1fa00 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66  M_Zero ){.    if
1fa10 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70  ( pB1->flags & p
1fa20 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B2->flags & MEM_
1fa30 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65  Zero ){.      re
1fa40 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72  turn pB1->u.nZer
1fa50 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  o - pB2->u.nZero
1fa60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1fa70 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1fa80 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69  _Zero ){.      i
1fa90 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42  f( !isAllZero(pB
1faa0 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20  2->z, pB2->n) ) 
1fab0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1fac0 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e   return pB1->u.n
1fad0 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d  Zero - n2;.    }
1fae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1faf0 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e  !isAllZero(pB1->
1fb00 7a 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74  z, pB1->n) ) ret
1fb10 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1fb20 74 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75  turn n1 - pB2->u
1fb30 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20  .nZero;.    }.  
1fb40 7d 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  }.  c = memcmp(p
1fb50 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e  B1->z, pB2->z, n
1fb60 31 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b  1>n2 ? n2 : n1);
1fb70 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72  .  if( c ) retur
1fb80 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31  n c;.  return n1
1fb90 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - n2;.}../*.** 
1fba0 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  Do a comparison 
1fbb0 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74  between a 64-bit
1fbc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1fbd0 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  and a 64-bit flo
1fbe0 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e  ating-point.** n
1fbf0 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e  umber.  Return n
1fc00 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1fc10 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1fc20 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73  e first (i64) is
1fc30 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65   less than,.** e
1fc40 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1fc50 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1fc60 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f  ond (double)..*/
1fc70 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1fc80 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1fc90 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65  re(i64 i, double
1fca0 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f   r){.  if( sizeo
1fcb0 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50  f(LONGDOUBLE_TYP
1fcc0 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47  E)>8 ){.    LONG
1fcd0 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20  DOUBLE_TYPE x = 
1fce0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1fcf0 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20  )i;.    if( x<r 
1fd00 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1fd10 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72   if( x>r ) retur
1fd20 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1fd30 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1fd40 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62   i64 y;.    doub
1fd50 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c  le s;.    if( r<
1fd60 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
1fd70 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20  5808.0 ) return 
1fd80 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39  +1;.    if( r>=9
1fd90 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1fda0 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  08.0 ) return -1
1fdb0 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72  ;.    y = (i64)r
1fdc0 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20  ;.    if( i<y ) 
1fdd0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1fde0 66 28 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20  f( i>y ) return 
1fdf0 2b 31 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75  +1;.    s = (dou
1fe00 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73  ble)i;.    if( s
1fe10 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <r ) return -1;.
1fe20 20 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65      if( s>r ) re
1fe30 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74  turn +1;.    ret
1fe40 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
1fe50 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1fe60 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
1fe70 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f   by the two memo
1fe80 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e  ry cells, return
1fe90 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  ing.** negative,
1fea0 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76   zero or positiv
1feb0 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65  e if pMem1 is le
1fec0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1fed0 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a  o, or greater.**
1fee0 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72   than pMem2. Sor
1fef0 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55  ting order is NU
1ff00 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c  LL's first, foll
1ff10 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20  owed by numbers 
1ff20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64  (integers.** and
1ff30 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e   reals) sorted n
1ff40 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c  umerically, foll
1ff50 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64  owed by text ord
1ff60 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c  ered by the coll
1ff70 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1ff80 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61  e pColl and fina
1ff90 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72  lly blob's order
1ffa0 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a  ed by memcmp()..
1ffb0 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76  **.** Two NULL v
1ffc0 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1ffd0 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68  ered equal by th
1ffe0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
1fff0 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  int sqlite3MemCo
20000 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
20010 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65  *pMem1, const Me
20020 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20  m *pMem2, const 
20030 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
20040 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20  .  int f1, f2;. 
20050 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   int combined_fl
20060 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65  ags;..  f1 = pMe
20070 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20  m1->flags;.  f2 
20080 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a  = pMem2->flags;.
20090 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73    combined_flags
200a0 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65   = f1|f2;.  asse
200b0 72 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65  rt( !sqlite3Vdbe
200c0 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d  MemIsRowSet(pMem
200d0 31 29 20 26 26 20 21 73 71 6c 69 74 65 33 56 64  1) && !sqlite3Vd
200e0 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d  beMemIsRowSet(pM
200f0 65 6d 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49  em2) );. .  /* I
20100 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e  f one value is N
20110 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20  ULL, it is less 
20120 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20  than the other. 
20130 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  If both values. 
20140 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65   ** are NULL, re
20150 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
20160 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
20170 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
20180 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d    return (f2&MEM
20190 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d  _Null) - (f1&MEM
201a0 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _Null);.  }..  /
201b0 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  * At least one o
201c0 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  f the two values
201d0 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a   is a number.  *
201e0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
201f0 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c  _flags&(MEM_Int|
20200 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74  MEM_Real|MEM_Int
20210 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 74 65 73  Real) ){.    tes
20220 74 63 61 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f  tcase( combined_
20230 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
20240 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20250 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
20260 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
20270 20 20 74 65 73 74 63 61 73 65 28 20 63 6f 6d 62    testcase( comb
20280 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
20290 5f 49 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20  _IntReal );.    
202a0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 28  if( (f1 & f2 & (
202b0 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52  MEM_Int|MEM_IntR
202c0 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  eal))!=0 ){.    
202d0 20 20 74 65 73 74 63 61 73 65 28 20 66 31 20 26    testcase( f1 &
202e0 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b   f2 & MEM_Int );
202f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20300 20 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49   f1 & f2 & MEM_I
20310 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ntReal );.      
20320 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
20330 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
20340 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
20350 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
20360 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
20370 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
20380 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
20390 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
203a0 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b   MEM_Real)!=0 ){
203b0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
203c0 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.r < pMem2->u
203d0 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .r ) return -1;.
203e0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
203f0 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r > pMem2->u.
20400 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
20410 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
20420 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
20430 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49 6e  &(MEM_Int|MEM_In
20440 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20  tReal))!=0 ){.  
20450 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 31      testcase( f1
20460 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
20470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 31      testcase( f1
20480 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
20490 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  ;.      if( (f2&
204a0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
204b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
204c0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
204d0 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
204e0 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
204f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
20500 66 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  f2&(MEM_Int|MEM_
20510 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a  IntReal))!=0 ){.
20520 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
20530 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
20540 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
20550 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
20560 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
20570 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
20580 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20590 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
205a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
205b0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
205c0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
205d0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
205e0 20 20 20 20 69 66 28 20 28 66 32 26 28 4d 45 4d      if( (f2&(MEM
205f0 5f 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c  _Int|MEM_IntReal
20600 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
20610 20 74 65 73 74 63 61 73 65 28 20 66 32 20 26 20   testcase( f2 & 
20620 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20  MEM_Int );.     
20630 20 20 20 74 65 73 74 63 61 73 65 28 20 66 32 20     testcase( f2 
20640 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b  & MEM_IntReal );
20650 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20660 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
20670 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75  Compare(pMem2->u
20680 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b  .i, pMem1->u.r);
20690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
206a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
206b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
206c0 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20     return +1;.  
206d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
206e0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
206f0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
20700 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
20710 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
20720 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
20730 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
20740 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
20750 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
20760 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
20770 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
20780 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
20790 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
207a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
207b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
207c0 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
207d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
207e0 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
207f0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
20800 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c  nc==pMem2->enc |
20810 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c  | pMem1->db->mal
20820 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
20830 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
20840 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
20850 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
20860 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
20870 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
20880 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
20890 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
208a0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
208b0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
208c0 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
208d0 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
208e0 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
208f0 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
20900 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
20910 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
20920 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
20930 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
20940 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
20950 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
20960 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
20970 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
20980 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
20990 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
209a0 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
209b0 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
209c0 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
209d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
209e0 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
209f0 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
20a00 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
20a10 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
20a20 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
20a30 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
20a40 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
20a50 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
20a60 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
20a70 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
20a80 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
20a90 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
20aa0 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
20ab0 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
20ac0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
20ad0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
20ae0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
20af0 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
20b00 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
20b10 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
20b20 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
20b30 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
20b40 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
20b50 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
20b60 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
20b70 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
20b80 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
20b90 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
20ba0 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
20bb0 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
20bc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
20bd0 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
20be0 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
20bf0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
20c00 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
20c10 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
20c20 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
20c30 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
20c40 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
20c50 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
20c60 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
20c70 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
20c80 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
20c90 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
20ca0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
20cb0 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
20cc0 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
20cd0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
20ce0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20cf0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
20d00 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
20d10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20d20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
20d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
20d40 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20d50 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
20d60 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
20d70 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
20d80 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
20d90 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
20da0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
20db0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
20dc0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
20dd0 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
20de0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
20df0 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
20e00 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
20e10 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
20e20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
20e30 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
20e40 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
20e50 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
20e60 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
20e70 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
20e80 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
20e90 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
20ea0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
20eb0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
20ec0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20ed0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
20ee0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
20ef0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
20f00 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
20f10 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
20f20 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
20f30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
20f40 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
20f50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20f60 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
20f70 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
20f80 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
20f90 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
20fa0 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
20fb0 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
20fc0 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
20fd0 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
20fe0 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
20ff0 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
21000 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
21010 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
21020 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
21030 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
21040 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
21050 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
21060 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
21070 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
21080 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
21090 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
210a0 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
210b0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
210c0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
210d0 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
210e0 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
210f0 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
21100 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
21110 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
21120 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
21130 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
21140 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
21150 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
21160 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
21170 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
21180 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
21190 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
211a0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
211b0 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
211c0 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
211d0 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
211e0 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
211f0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
21200 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
21210 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
21220 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
21230 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
21240 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
21250 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
21260 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
21270 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
21280 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
21290 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
212a0 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
212b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
212c0 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
212d0 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
212e0 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
212f0 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
21300 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
21310 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
21320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
21330 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
21340 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
21350 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
21360 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
21370 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
21380 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
21390 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
213a0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
213b0 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
213d0 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
213e0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
213f0 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21410 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
21420 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
21430 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
21440 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
21450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21460 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
21470 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
21480 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
21490 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
214b0 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
214c0 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
214d0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
21500 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
21510 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
21520 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
21530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21540 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
21550 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
21560 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
21570 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
21580 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
21590 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
215a0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  *pKeyInfo;.  con
215b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
215c0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
215d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
215e0 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
215f0 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
21600 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
21610 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
21620 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
21630 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
21640 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
21650 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
21660 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
21670 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
21680 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
21690 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
216a0 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
216b0 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
216c0 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
216d0 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
216e0 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
216f0 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
21700 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
21710 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
21720 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
21730 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
21740 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
21750 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
21760 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
21770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
21780 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
21790 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
217a0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
217b0 31 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  1;.    i = 0;.  
217c0 7d 0a 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69  }.  if( d1>(unsi
217d0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
217e0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
217f0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
21800 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21810 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
21820 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
21830 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
21840 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
21850 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
21860 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
21870 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
21880 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
21890 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
218a0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
218b0 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
218c0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
218d0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
218e0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
218f0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
21900 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
21910 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30  nfo->nKeyField>0
21920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
21930 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
21940 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
21950 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
21960 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52  _type;..    /* R
21970 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  HS is an integer
21980 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73   */.    if( pRhs
21990 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
219a0 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20  nt|MEM_IntReal) 
219b0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
219c0 65 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  e( pRhs->flags &
219d0 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
219e0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 68 73    testcase( pRhs
219f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
21a00 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 73  tReal );.      s
21a10 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
21a20 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
21a30 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
21a40 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
21a50 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
21a60 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
21a70 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
21a80 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
21a90 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
21aa0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
21ab0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
21ac0 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
21ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21ae0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
21af0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
21b00 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
21b10 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
21b20 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
21b30 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
21b40 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
21b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
21b60 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
21b70 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
21b80 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
21b90 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
21ba0 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
21bb0 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
21bc0 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
21bd0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
21be0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
21bf0 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
21c00 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
21c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21c20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
21c30 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
21c40 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
21c50 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
21c60 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
21c70 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
21c80 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
21c90 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
21ca0 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
21cb0 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
21cc0 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
21cd0 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
21ce0 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
21cf0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
21d00 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
21d10 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
21d20 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
21d30 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
21d40 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
21d50 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
21d60 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
21d70 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
21d80 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
21d90 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
21da0 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
21db0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
21dc0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
21dd0 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
21de0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
21df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
21e10 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
21e20 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
21e30 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
21e40 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
21e50 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
21e60 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
21e70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
21e80 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21e90 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21ea0 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
21eb0 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
21ec0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
21ed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21f00 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
21f10 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
21f20 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
21f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21f40 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
21f50 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
21f60 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
21f70 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
21f80 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
21f90 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
21fa0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
21fb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
21fc0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
21fd0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
21fe0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
21ff0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
22000 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
22010 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
22020 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
22030 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
22040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
22050 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
22060 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
22070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22080 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
22090 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
220a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
220b0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
220c0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
220d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
220e0 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
220f0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 0a 20 20  nsigned)nKey1.  
22100 20 20 20 20 20 20 20 7c 7c 20 28 70 4b 65 79 49         || (pKeyI
22110 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
22120 65 79 49 6e 66 6f 29 2d 3e 6e 41 6c 6c 46 69 65  eyInfo)->nAllFie
22130 6c 64 3c 3d 69 0a 20 20 20 20 20 20 20 20 29 7b  ld<=i.        ){
22140 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
22150 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
22160 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
22170 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
22180 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
22190 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
221a0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
221b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
221c0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
221d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
221e0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
221f0 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
22200 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
22210 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
22220 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
22230 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
22240 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
22250 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
22260 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
22270 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
22280 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
22290 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
222a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
222b0 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
222c0 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
222d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
222e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
222f0 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
22300 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
22310 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
22320 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
22330 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
22340 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
22350 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
22360 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
22370 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22380 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
22390 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
223a0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
223b0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
223c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
223d0 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRhs->flags & M
223e0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70  EM_Zero)==0 || p
223f0 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Rhs->n==0 );.   
22400 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
22410 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
22420 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
22430 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
22440 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
22450 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
22460 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
22470 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
22480 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
22490 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
224a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
224b0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
224c0 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
224d0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
224e0 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
224f0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
22500 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
22510 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
22520 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
22530 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
22540 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
22550 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
22560 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
22570 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
22580 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
225c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
225d0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
225e0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
225f0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c         if( !isAl
22600 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61  lZero((const cha
22610 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53  r*)&aKey1[d1],nS
22620 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tr) ){.         
22630 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
22640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22650 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74          rc = nSt
22660 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72  r - pRhs->u.nZer
22670 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
22680 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22690 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
226a0 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
226b0 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
226c0 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
226d0 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
226e0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
226f0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
22700 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
22710 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
22720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
22730 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
22740 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
22750 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
22760 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
22770 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
22780 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
22790 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
227a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 4b  ){.      if( pPK
227b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
227c0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
227d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
227e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
227f0 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
22800 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
22810 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
22820 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
22830 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
22840 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
22850 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
22860 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
22870 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
22880 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20     i++;.    if( 
22890 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  i==pPKey2->nFiel
228a0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  d ) break;.    p
228b0 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
228c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
228d0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
228e0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
228f0 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
22900 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
22910 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
22920 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
22930 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  r1 && d1<=(unsig
22940 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
22950 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
22960 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
22970 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
22980 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
22990 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
229a0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
229b0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
229c0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
229d0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
229e0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
229f0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
22a00 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22a10 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
22a20 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
22a30 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
22a40 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
22a50 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
22a60 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
22a70 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
22a80 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
22a90 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
22aa0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
22ab0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
22ac0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
22ad0 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
22ae0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
22af0 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
22b00 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
22b10 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
22b20 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
22b30 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
22b40 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
22b50 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
22b60 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
22b70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
22b80 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
22b90 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
22ba0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
22bb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
22bc0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
22bd0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
22be0 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
22bf0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
22c00 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
22c10 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
22c20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
22c30 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22c40 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
22c50 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
22c60 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
22c70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22c80 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
22c90 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
22ca0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22cb0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
22cc0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
22cd0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
22ce0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
22cf0 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
22d00 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
22d10 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
22d20 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
22d30 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
22d40 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
22d50 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
22d60 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
22d70 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
22d80 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
22d90 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
22da0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
22db0 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
22dc0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
22dd0 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
22de0 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
22df0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
22e00 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
22e10 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
22e20 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
22e30 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
22e40 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
22e50 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
22e60 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
22e70 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
22e80 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
22e90 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
22ea0 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
22eb0 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
22ec0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
22ed0 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
22ee0 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
22ef0 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
22f00 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  4 x;.  i64 v;.  
22f10 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
22f20 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
22f30 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
22f40 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
22f50 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
22f60 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
22f70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
22f80 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
22f90 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
22fa0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
22fb0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
22fc0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
22fd0 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
22fe0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
22ff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23000 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
23010 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23020 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
23030 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
23040 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
23050 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
23060 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
23070 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
23080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23090 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
230a0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
230b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
230c0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
230d0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
230e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
230f0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
23100 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
23110 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
23120 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
23130 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
23140 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
23150 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
23160 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
23170 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23180 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
23190 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
231a0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
231b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
231c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
231d0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
231e0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
231f0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
23200 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
23210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
23220 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
23230 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
23240 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
23250 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
23260 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
23270 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
23280 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
23290 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
232a0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
232b0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
232c0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
232d0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
232e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
232f0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
23300 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
23310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23320 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
23330 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
23340 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
23350 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
23360 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
23370 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
23380 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
23390 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
233a0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
233b0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
233c0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
233d0 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
233e0 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
233f0 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
23400 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
23410 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
23420 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
23430 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
23440 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
23450 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
23460 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
23470 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
23480 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
23490 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
234a0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
234b0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
234c0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
234d0 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
234e0 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
234f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
23500 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
23510 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
23520 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
23530 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
23540 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
23550 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23560 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
23570 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76  PKey2);.  }..  v
23580 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
23590 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e  0].u.i;.  if( v>
235a0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
235b0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
235c0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
235d0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
235e0 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
235f0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
23600 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
23610 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
23620 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
23630 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
23640 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
23650 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
23660 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
23670 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
23680 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
23690 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
236a0 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ey2, 1);.  }else
236b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
236c0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
236d0 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
236e0 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ual and there ar
236f0 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20  e no trailing.  
23700 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74    ** fields. Ret
23710 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
23720 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63  ult_rc in this c
23730 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20  ase. */.    res 
23740 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
23750 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32  t_rc;.    pPKey2
23760 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
23770 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
23780 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
23790 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
237a0 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29  , pPKey2, res) )
237b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
237c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
237d0 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
237e0 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
237f0 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
23800 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
23810 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
23820 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
23830 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c  ey2 is a string,
23840 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69   that (b) the fi
23850 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65  rst field.** use
23860 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
23870 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20  sequence BINARY 
23880 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65  and (c) that the
23890 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
238a0 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68  varint .** at th
238b0 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
238c0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
238d0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
238e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
238f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
23900 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65  tring(.  int nKe
23910 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
23920 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
23930 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
23940 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
23950 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
23960 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
23970 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f   u8 *aKey1 = (co
23980 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20  nst u8*)pKey1;. 
23990 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
239a0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
239b0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
239c0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20  aMem[0].flags & 
239d0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62  MEM_Str );.  vdb
239e0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
239f0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
23a00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
23a10 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
23a20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
23a30 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74  ey1[1], serial_t
23a40 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69  ype);.  if( seri
23a50 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
23a60 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
23a70 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
23a80 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
23a90 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
23aa0 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
23ab0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
23ac0 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
23ad0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
23ae0 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
23af0 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
23b00 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
23b10 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
23b20 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
23b30 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
23b40 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
23b50 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
23b60 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
23b70 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
23b80 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
23b90 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
23ba0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
23bb0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
23bc0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72  rn 0;    /* Corr
23bd0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
23be0 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20      nCmp = MIN( 
23bf0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
23c00 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72  n, nStr );.    r
23c10 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  es = memcmp(&aKe
23c20 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79  y1[szHdr], pPKey
23c30 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43  2->aMem[0].z, nC
23c40 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65  mp);..    if( re
23c50 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
23c60 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
23c70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
23c80 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  <0 ){.      res 
23c90 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
23ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
23cb0 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
23cc0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
23cd0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
23ce0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
23cf0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
23d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
23d10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
23d20 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
23d30 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
23d40 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
23d50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23d60 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
23d70 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
23d80 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
23d90 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
23da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23db0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
23dc0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
23dd0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
23de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23df0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
23e00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
23e10 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
23e20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
23e30 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
23e40 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
23e50 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
23e60 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
23e70 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
23e80 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
23e90 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
23ea0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
23eb0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
23ec0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
23ed0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23ee0 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
23ef0 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
23f00 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
23f10 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
23f20 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
23f30 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
23f40 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
23f50 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
23f60 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
23f70 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
23f80 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
23f90 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
23fa0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
23fb0 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
23fc0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
23fd0 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
23fe0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
23ff0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
24000 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
24010 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
24020 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
24030 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
24040 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
24050 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
24060 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
24070 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
24080 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
24090 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
240a0 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
240b0 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
240c0 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
240d0 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
240e0 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
240f0 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
24100 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
24110 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
24120 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
24130 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
24140 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
24150 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
24160 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
24170 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
24180 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
24190 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
241a0 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
241b0 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
241c0 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
241d0 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
241e0 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
241f0 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
24200 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
24210 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
24220 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
24230 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
24240 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
24250 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
24260 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
24270 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
24280 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
24290 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
242a0 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
242b0 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
242c0 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
242d0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
242e0 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29 7b  nAllField<=13 ){
242f0 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
24300 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
24310 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
24320 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
24330 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
24340 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
24350 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
24360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
24370 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
24380 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
24390 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
243a0 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
243b0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
243c0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
243d0 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
243e0 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
243f0 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
24400 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
24410 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
24420 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
24430 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
24440 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
24450 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 52 65  M_Real|MEM_IntRe
24460 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
24470 42 6c 6f 62 29 29 3d 3d 30 0a 20 20 20 20 20 26  Blob))==0.     &
24480 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
24490 43 6f 6c 6c 5b 30 5d 3d 3d 30 0a 20 20 20 20 29  Coll[0]==0.    )
244a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
244b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
244c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
244d0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
244e0 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
244f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
24500 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
24510 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
24520 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
24530 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
24540 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
24550 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
24560 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
24570 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
24580 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
24590 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
245a0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
245b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
245c0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
245d0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
245e0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
245f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
24600 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
24610 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
24620 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
24630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
24640 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
24650 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
24660 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
24670 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
24680 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
24690 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
246a0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
246b0 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
246c0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
246d0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
246e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
246f0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
24700 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
24710 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
24720 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
24730 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
24740 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
24750 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
24760 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
24770 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
24780 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
24790 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
247a0 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
247b0 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
247c0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
247d0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
247e0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
247f0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
24800 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
24810 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
24820 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
24830 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
24840 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
24850 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
24860 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
24870 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
24880 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
24890 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
248a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
248b0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
248c0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
248d0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
248e0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
248f0 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  e(pCur);.  asser
24900 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
24910 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
24920 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
24930 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
24940 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
24950 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
24960 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
24970 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
24980 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
24990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
249a0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
249b0 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
249c0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
249d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
249e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
249f0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
24a00 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
24a10 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
24a20 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
24a30 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
24a40 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
24a50 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
24a60 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
24a70 6e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  n );.  testcase(
24a80 20 73 7a 48 64 72 3e 30 78 37 66 66 66 66 66 66   szHdr>0x7ffffff
24a90 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d  f );.  assert( m
24aa0 2e 6e 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 75  .n>=0 );.  if( u
24ab0 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
24ac0 7c 7c 20 73 7a 48 64 72 3e 28 75 6e 73 69 67 6e  || szHdr>(unsign
24ad0 65 64 29 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  ed)m.n) ){.    g
24ae0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
24af0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
24b00 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
24b10 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
24b20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
24b30 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
24b40 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
24b50 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
24b60 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
24b70 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
24b80 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
24b90 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
24ba0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
24bb0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
24bc0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
24bd0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
24be0 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
24bf0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
24c00 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
24c10 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
24c20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
24c30 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
24c40 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
24c50 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
24c60 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
24c70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
24c80 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
24c90 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
24ca0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
24cb0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
24cc0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
24cd0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
24ce0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
24cf0 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
24d00 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
24d10 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20  es[typeRowid];. 
24d20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29   testcase( (u32)
24d30 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f  m.n==szHdr+lenRo
24d40 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  wid );.  if( unl
24d50 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73  ikely((u32)m.n<s
24d60 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29  zHdr+lenRowid) )
24d70 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
24d80 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
24d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
24da0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
24db0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
24dc0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
24dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
24de0 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
24df0 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
24e00 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
24e10 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
24e20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
24e30 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
24e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24e50 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
24e60 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
24e70 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
24e80 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
24e90 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
24ea0 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
24eb0 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
24ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24ed0 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
24ee0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
24ef0 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61  testcase( m.szMa
24f00 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
24f10 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
24f20 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
24f30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24f40 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
24f50 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
24f60 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
24f70 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
24f80 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
24f90 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
24fa0 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
24fb0 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
24fc0 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
24fd0 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
24fe0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
24ff0 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
25000 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
25010 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
25020 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
25030 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
25040 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25050 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
25060 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
25070 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
25080 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
25090 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
250a0 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
250b0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
250c0 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
250d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
250e0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
250f0 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
25100 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
25110 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
25120 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
25130 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
25140 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
25150 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
25160 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
25170 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
25180 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
25190 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
251c0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
251d0 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20  beCursor *pC,   
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
251f0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
25200 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
25210 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
25220 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
25230 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
25240 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79  d version of key
25250 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20   */.  int *res  
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25280 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
25290 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
252a0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
252b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
252c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
252d0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
252e0 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
252f0 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
25300 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d   );.  pCur = pC-
25310 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61  >uc.pCursor;.  a
25320 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
25330 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
25340 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
25350 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
25360 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
25370 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c  Cur);.  /* nCell
25380 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
25390 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
253a0 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
253b0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
253c0 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
253d0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
253e0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
253f0 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
25400 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
25410 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
25420 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
25430 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
25440 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
25450 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25460 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
25470 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
25480 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
25490 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
254a0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
254b0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
254c0 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
254d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
254e0 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69   }.  *res = sqli
254f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
25500 70 61 72 65 57 69 74 68 53 6b 69 70 28 6d 2e 6e  pareWithSkip(m.n
25510 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
25520 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
25530 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
25540 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25550 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
25570 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
25580 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
25590 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
255a0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
255b0 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
255c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
255d0 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
255e0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
255f0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
25600 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
25610 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25620 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
25630 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
25640 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
25650 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
25660 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
25670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
25680 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
25690 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
256a0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
256b0 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
256c0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
256d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
256e0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
256f0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
25700 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
25710 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
25720 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
25730 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
25740 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
25750 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
25760 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
25770 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
25780 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
25790 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
257a0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
257b0 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
257c0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
257d0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
257e0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
257f0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
25800 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
25810 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
25820 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
25830 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
25840 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
25850 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
25860 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
25870 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
25880 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
25890 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
258a0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
258b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 43 6f 64  e..**.** If iCod
258c0 65 20 69 73 20 31 2c 20 74 68 65 6e 20 65 78 70  e is 1, then exp
258d0 69 72 61 74 69 6f 6e 20 69 73 20 61 64 76 69 73  iration is advis
258e0 6f 72 79 2e 20 20 54 68 65 20 73 74 61 74 65 6d  ory.  The statem
258f0 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ent should.** be
25900 20 72 65 70 72 65 70 61 72 65 64 20 62 65 66 6f   reprepared befo
25910 72 65 20 62 65 69 6e 67 20 72 65 73 74 61 72 74  re being restart
25920 65 64 2c 20 62 75 74 20 69 66 20 69 74 20 69 73  ed, but if it is
25930 20 61 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67   already running
25940 0a 2a 2a 20 69 74 20 69 73 20 61 6c 6c 6f 77 65  .** it is allowe
25950 64 20 74 6f 20 72 75 6e 20 74 6f 20 63 6f 6d 70  d to run to comp
25960 6c 65 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  letion..**.** In
25970 74 65 72 6e 61 6c 6c 79 2c 20 74 68 69 73 20 66  ternally, this f
25980 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 73 65 74  unction just set
25990 73 20 74 68 65 20 56 64 62 65 2e 65 78 70 69 72  s the Vdbe.expir
259a0 65 64 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a  ed flag on all.*
259b0 2a 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  * prepared state
259c0 6d 65 6e 74 73 2e 20 20 54 68 65 20 66 6c 61 67  ments.  The flag
259d0 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
259e0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 65 78   an immediate ex
259f0 70 69 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  piration.** and 
25a00 73 65 74 20 74 6f 20 32 20 66 6f 72 20 61 6e 20  set to 2 for an 
25a10 61 64 76 69 73 6f 72 79 20 65 78 70 69 72 61 74  advisory expirat
25a20 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
25a30 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
25a40 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
25a50 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 43  ite3 *db, int iC
25a60 6f 64 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  ode){.  Vdbe *p;
25a70 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
25a80 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
25a90 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
25aa0 69 72 65 64 20 3d 20 69 43 6f 64 65 2b 31 3b 0a  ired = iCode+1;.
25ab0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
25ac0 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
25ad0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
25ae0 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
25af0 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
25b00 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
25b10 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
25b20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25b30 68 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52  he SQLITE_PREPAR
25b40 45 20 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64  E flags for a Vd
25b50 62 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  be..*/.u8 sqlite
25b60 33 56 64 62 65 50 72 65 70 61 72 65 46 6c 61 67  3VdbePrepareFlag
25b70 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  s(Vdbe *v){.  re
25b80 74 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67  turn v->prepFlag
25b90 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
25ba0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25bb0 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
25bc0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
25bd0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
25be0 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
25bf0 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
25c00 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
25c10 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
25c20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
25c30 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
25c40 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
25c50 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
25c60 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
25c70 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
25c80 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
25c90 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
25ca0 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
25cb0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
25cc0 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
25cd0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
25ce0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
25cf0 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
25d00 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
25d10 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
25d20 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
25d30 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
25d40 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
25d50 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
25d60 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
25d70 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
25d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 76  ;.    assert( (v
25d90 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
25da0 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29  LITE_EnableQPSG)
25db0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==0 );.    if( 0
25dc0 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
25dd0 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
25de0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
25df0 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
25e00 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
25e10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
25e20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25e30 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
25e40 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
25e50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25e60 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
25e70 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
25e80 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
25e90 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
25ea0 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
25eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
25ec0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
25ed0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
25ee0 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
25ef0 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
25f00 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
25f10 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
25f20 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
25f30 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
25f40 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
25f50 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
25f60 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
25f70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25f80 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
25f90 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
25fa0 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
25fb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
25fc0 76 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  v->db->flags & S
25fd0 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47  QLITE_EnableQPSG
25fe0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56  )==0 );.  if( iV
25ff0 61 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d  ar>=32 ){.    v-
26000 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30  >expmask |= 0x80
26010 30 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b  000000;.  }else{
26020 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
26030 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
26040 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Var-1));.  }.}..
26050 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75  /*.** Cause a fu
26060 6e 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20  nction to throw 
26070 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 77  an error if it w
26080 61 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f  as call from OP_
26090 50 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68  PureFunc.** rath
260a0 65 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74  er than OP_Funct
260b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75  ion..**.** OP_Pu
260c0 72 65 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61  reFunc means tha
260d0 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d  t the function m
260e0 75 73 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69  ust be determini
260f0 73 74 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64  stic, and should
26100 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72  .** throw an err
26110 6f 72 20 69 66 20 69 74 20 69 73 20 67 69 76 65  or if it is give
26120 6e 20 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f  n inputs that wo
26130 75 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d  uld make it non-
26140 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a  deterministic..*
26150 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
26160 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74  s invoked by dat
26170 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73  e/time functions
26180 20 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65   that use non-de
26190 74 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66  terministic.** f
261a0 65 61 74 75 72 65 73 20 73 75 63 68 20 61 73 20  eatures such as 
261b0 27 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71  'now'..*/.int sq
261c0 6c 69 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63  lite3NotPureFunc
261d0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
261e0 20 2a 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20   *pCtx){.#ifdef 
261f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
26200 41 54 34 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  AT4.  if( pCtx->
26210 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74 75 72  pVdbe==0 ) retur
26220 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  n 1;.#endif.  if
26230 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d 3e 61  ( pCtx->pVdbe->a
26240 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e 6f 70  Op[pCtx->iOp].op
26250 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46 75 6e  code==OP_PureFun
26260 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
26270 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
26280 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e 6f 6e  tx, .       "non
26290 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
262a0 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64 65 78  unction in index
262b0 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 43   expression or C
262c0 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 22  HECK constraint"
262d0 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a 20 20  ,.       -1);.  
262e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
262f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 23    return 1;.}..#
26300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26310 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
26320 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
26330 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
26340 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
26350 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
26360 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
26370 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
26380 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
26390 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
263a0 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
263b0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
263c0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
263d0 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
263e0 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
263f0 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
26400 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
26410 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
26420 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d  b){.  if( pVtab-
26430 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
26440 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
26450 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
26460 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
26470 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
26480 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
26490 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
264a0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
264b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
264c0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
264d0 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d      pVtab->zErrM
264e0 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  sg = 0;.  }.}.#e
264f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
26500 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
26510 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
26520 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
26530 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20  ATE_HOOK../*.** 
26540 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
26550 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
26560 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20  LL, release any 
26570 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
26580 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
26590 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  the memory cells
265a0 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b   in the p->aMem[
265b0 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72  ] array. Also fr
265c0 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52  ee the UnpackedR
265d0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
265e0 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67  re itself, using
265f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
26600 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
26610 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
26620 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65   free UnpackedRe
26630 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20  cord structures 
26640 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
26650 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65  the vdbeUnpackRe
26660 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  cord() function 
26670 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69  found in vdbeapi
26680 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .c..*/.static vo
26690 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  id vdbeFreeUnpac
266a0 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ked(sqlite3 *db,
266b0 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55 6e 70   int nField, Unp
266c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
266d0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
266e0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
266f0 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b  =0; i<nField; i+
26700 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  +){.      Mem *p
26710 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
26720 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ];.      if( pMe
26730 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m->zMalloc ) sql
26740 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
26750 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  se(pMem);.    }.
26760 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
26770 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  eNN(db, p);.  }.
26780 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
26790 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
267a0 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
267b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
267c0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
267d0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
267e0 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
267f0 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  k. If this is an
26800 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
26810 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c  E pre-update cal
26820 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f  l,.** then curso
26830 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
26840 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
26850 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
26860 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a  the row about.**
26870 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72   to be update or
26880 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65   deleted. If the
26890 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c   application cal
268a0 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70  ls sqlite3_preup
268b0 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74  date_old(),.** t
268c0 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75  he required valu
268d0 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  e will be read f
268e0 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20  rom the row the 
268f0 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
26900 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26910 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f  3VdbePreUpdateHo
26920 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  ok(.  Vdbe *v,  
26930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26940 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72        /* Vdbe pr
26950 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73  e-update hook is
26960 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20   invoked by */. 
26970 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73   VdbeCursor *pCs
26980 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
26990 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72   /* Cursor to gr
269a0 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20  ab old.* values 
269b0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  from */.  int op
269c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
269d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
269e0 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41  ITE_INSERT, UPDA
269f0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a  TE or DELETE */.
26a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
26a10 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
26a20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
26a30 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
26a40 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
26a50 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66          /* Modif
26a60 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ied table */.  i
26a70 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a90 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
26aa0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  lue */.  int iRe
26ab0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
26ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
26ad0 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72  ster for new.* r
26ae0 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71  ecord */.){.  sq
26af0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64  lite3 *db = v->d
26b00 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a  b;.  i64 iKey2;.
26b10 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75    PreUpdate preu
26b20 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pdate;.  const c
26b30 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62  har *zTbl = pTab
26b40 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69  ->zName;.  stati
26b50 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53  c const u8 fakeS
26b60 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20  ortOrder = 0;.. 
26b70 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72   assert( db->pPr
26b80 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20  eUpdate==0 );.  
26b90 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74  memset(&preupdat
26ba0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65  e, 0, sizeof(Pre
26bb0 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20  Update));.  if( 
26bc0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d  HasRowid(pTab)==
26bd0 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31 20 3d  0 ){.    iKey1 =
26be0 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20 20 20   iKey2 = 0;.    
26bf0 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20 3d 20  preupdate.pPk = 
26c00 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
26c10 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
26c20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6f  }else{.    if( o
26c30 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
26c40 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20   ){.      iKey2 
26c50 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e  = v->aMem[iReg].
26c60 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  u.i;.    }else{.
26c70 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b        iKey2 = iK
26c80 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ey1;.    }.  }..
26c90 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
26ca0 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
26cb0 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
26cc0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
26cd0 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
26ce0 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
26cf0 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
26d00 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
26d10 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
26d20 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
26d30 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
26d40 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
26d50 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
26d60 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26d70 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
26d80 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
26d90 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
26da0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26db0 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 70  fo.nKeyField = p
26dc0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65  Tab->nCol;.  pre
26dd0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61  update.keyinfo.a
26de0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
26df0 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b  )&fakeSortOrder;
26e00 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
26e10 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72  y1 = iKey1;.  pr
26e20 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20  eupdate.iKey2 = 
26e30 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61  iKey2;.  preupda
26e40 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  te.pTab = pTab;.
26e50 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
26e60 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a  e = &preupdate;.
26e70 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
26e80 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72  Callback(db->pPr
26e90 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20  eUpdateArg, db, 
26ea0 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  op, zDb, zTbl, i
26eb0 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20  Key1, iKey2);.  
26ec0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
26ed0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
26ee0 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
26ef0 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64  e.aRecord);.  vd
26f00 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
26f10 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  b, preupdate.key
26f20 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31  info.nKeyField+1
26f30 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70  , preupdate.pUnp
26f40 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72  acked);.  vdbeFr
26f50 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
26f60 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
26f70 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20 70 72  .nKeyField+1, pr
26f80 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61  eupdate.pNewUnpa
26f90 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65  cked);.  if( pre
26fa0 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20  update.aNew ){. 
26fb0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
26fc0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e  r(i=0; i<pCsr->n
26fd0 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
26fe0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
26ff0 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64  mRelease(&preupd
27000 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20  ate.aNew[i]);.  
27010 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
27020 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72 65 75  bFreeNN(db, preu
27030 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d  pdate.aNew);.  }
27040 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
27050 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
27060 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a           DATE_HOOK */.