/ Hex Artifact Content
Login

Artifact 793111f45c2973491bcad36e345514cdaa0b16f0a7b2e9ae887a7050e4d6efdf:


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 50 61 72 73 65 20 2a 70 50 61 72 73  aOp(Parse *pPars
2e10: 65 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  e, int iDb, char
2e20: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 56 64 62   *zWhere){.  Vdb
2e30: 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
2e40: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Vdbe;.  int j;. 
2e50: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72   sqlite3SchemaWr
2e60: 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  itable(pParse, i
2e70: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
2e80: 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50  beAddOp4(p, OP_P
2e90: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
2ea0: 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50   0, 0, zWhere, P
2eb0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f  4_DYNAMIC);.  fo
2ec0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e  r(j=0; j<p->db->
2ed0: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65  nDb; j++) sqlite
2ee0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70  3VdbeUsesBtree(p
2ef0: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , j);.}../*.** A
2f00: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
2f10: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
2f20: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  4 value as an in
2f30: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
2f40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2f50: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  nt(.  Vdbe *p,  
2f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2f70: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
2f80: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
2f90: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2fa0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
2fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fd0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
2fe0: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
2ff0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
3000: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
3010: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
3020: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
3030: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20  nd */.  int p4  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3050: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73  he P4 operand as
3060: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29   an integer */.)
3070: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
3080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3090: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
30a0: 70 33 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  p3);.  if( p->db
30b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
30c0: 30 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  0 ){.    VdbeOp 
30d0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
30e0: 64 64 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  ddr];.    pOp->p
30f0: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
3100: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  ;.    pOp->p4.i 
3110: 3d 20 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = p4;.  }.  retu
3120: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49  rn addr;.}../* I
3130: 6e 73 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66  nsert the end of
3140: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f   a co-routine.*/
3150: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3160: 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64  eEndCoroutine(Vd
3170: 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69  be *v, int regYi
3180: 65 6c 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  eld){.  sqlite3V
3190: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
31a0: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  EndCoroutine, re
31b0: 67 59 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43  gYield);..  /* C
31c0: 6c 65 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61  lear the tempora
31d0: 72 79 20 72 65 67 69 73 74 65 72 20 63 61 63 68  ry register cach
31e0: 65 2c 20 74 68 65 72 65 62 79 20 65 6e 73 75 72  e, thereby ensur
31f0: 69 6e 67 20 74 68 61 74 20 65 61 63 68 0a 20 20  ing that each.  
3200: 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61  ** co-routine ha
3210: 73 20 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65  s its own indepe
3220: 6e 64 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67  ndent set of reg
3230: 69 73 74 65 72 73 2c 20 62 65 63 61 75 73 65 20  isters, because 
3240: 63 6f 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a  co-routines.  **
3250: 20 6d 69 67 68 74 20 65 78 70 65 63 74 20 74 68   might expect th
3260: 65 69 72 20 72 65 67 69 73 74 65 72 73 20 74 6f  eir registers to
3270: 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61 63   be preserved ac
3280: 72 6f 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64  ross an OP_Yield
3290: 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20  , and.  ** that 
32a0: 63 6f 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62  could cause prob
32b0: 6c 65 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d  lems if two or m
32c0: 6f 72 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  ore co-routines 
32d0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 73 61  are using the sa
32e0: 6d 65 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  me.  ** temporar
32f0: 79 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f  y register..  */
3300: 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54  .  v->pParse->nT
3310: 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d  empReg = 0;.  v-
3320: 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52  >pParse->nRangeR
3330: 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg = 0;.}../*.**
3340: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79   Create a new sy
3350: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72  mbolic label for
3360: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
3370: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
3380: 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68  be.** coded.  Th
3390: 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  e symbolic label
33a0: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
33b0: 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
33c0: 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c  r.  The.** label
33d0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
33e0: 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20  the P2 value of 
33f0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c  an operation.  L
3400: 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  ater, when.** th
3410: 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c  e label is resol
3420: 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69  ved to a specifi
3430: 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56  c address, the V
3440: 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a  DBE will scan.**
3450: 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65   through its ope
3460: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
3470: 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65  change all value
3480: 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61  s of P2 which ma
3490: 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  tch.** the label
34a0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76   into the resolv
34b0: 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  ed address..**.*
34c0: 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73  * The VDBE knows
34d0: 20 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65   that a P2 value
34e0: 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61   is a label beca
34f0: 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a  use labels are.*
3500: 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76  * always negativ
3510: 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20  e and P2 values 
3520: 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62  are suppose to b
3530: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a  e non-negative..
3540: 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61  ** Hence, a nega
3550: 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73  tive P2 value is
3560: 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61   a label that ha
3570: 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f  s yet to be reso
3580: 6c 76 65 64 2e 0a 2a 2a 20 28 4c 61 74 65 72 3a  lved..** (Later:
3590: 29 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 74  ) This is only t
35a0: 72 75 65 20 66 6f 72 20 6f 70 63 6f 64 65 73 20  rue for opcodes 
35b0: 74 68 61 74 20 68 61 76 65 20 74 68 65 20 4f 50  that have the OP
35c0: 46 4c 47 5f 4a 55 4d 50 0a 2a 2a 20 70 72 6f 70  FLG_JUMP.** prop
35d0: 65 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69  erty..**.** Vari
35e0: 61 62 6c 65 20 75 73 61 67 65 20 6e 6f 74 65 73  able usage notes
35f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 50 61 72 73  :.**.**     Pars
3600: 65 2e 61 4c 61 62 65 6c 5b 78 5d 20 20 20 20 20  e.aLabel[x]     
3610: 53 74 6f 72 65 73 20 74 68 65 20 61 64 64 72 65  Stores the addre
3620: 73 73 20 74 68 61 74 20 74 68 65 20 78 2d 74 68  ss that the x-th
3630: 20 6c 61 62 65 6c 20 72 65 73 6f 6c 76 65 73 0a   label resolves.
3640: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3650: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 6f 2e             into.
3660: 20 20 46 6f 72 20 74 65 73 74 69 6e 67 20 28 53    For testing (S
3670: 51 4c 49 54 45 5f 44 45 42 55 47 29 2c 20 75 6e  QLITE_DEBUG), un
3680: 72 65 73 6f 6c 76 65 64 0a 2a 2a 20 20 20 20 20  resolved.**     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 6c 61 62 65 6c 73 20 73 74 6f 72 65      labels store
36b0: 73 20 2d 31 2c 20 62 75 74 20 74 68 61 74 20 69  s -1, but that i
36c0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 41 6c 6c 6f 63 20 20 20 4e 75 6d 62 65  belAlloc   Numbe
36f0: 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63  r of slots alloc
3700: 61 74 65 64 20 74 6f 20 50 61 72 73 65 2e 61 4c  ated to Parse.aL
3710: 61 62 65 6c 5b 5d 0a 2a 2a 20 20 20 20 20 50 61  abel[].**     Pa
3720: 72 73 65 2e 6e 4c 61 62 65 6c 20 20 20 20 20 20  rse.nLabel      
3730: 20 20 54 68 65 20 2a 6e 65 67 61 74 69 76 65 2a    The *negative*
3740: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
3750: 66 20 6c 61 62 65 6c 73 20 74 68 61 74 20 68 61  f labels that ha
3760: 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ve.**           
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
3780: 65 6e 20 69 73 73 75 65 64 2e 20 20 54 68 65 20  en issued.  The 
3790: 6e 65 67 61 74 69 76 65 20 69 73 20 73 74 6f 72  negative is stor
37a0: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20  ed because.**   
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 74 68 61 74 20 67 69 76 65 73        that gives
37d0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
37e0: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20  mprovement over 
37f0: 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20  storing.**      
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e     the equivalen
3820: 74 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  t positive value
3830: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3840: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 50 61  VdbeMakeLabel(Pa
3850: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
3860: 72 65 74 75 72 6e 20 2d 2d 70 50 61 72 73 65 2d  return --pParse-
3870: 3e 6e 4c 61 62 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nLabel;.}../*.*
3880: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
3890: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
38a0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
38b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
38c0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
38d0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
38e0: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
38f0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
3900: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
3910: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
3920: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 73  akeLabel()..*/.s
3930: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
3940: 4e 4c 49 4e 45 20 76 6f 69 64 20 72 65 73 69 7a  NLINE void resiz
3950: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 50 61  eResolveLabel(Pa
3960: 72 73 65 20 2a 70 2c 20 56 64 62 65 20 2a 76 2c  rse *p, Vdbe *v,
3970: 20 69 6e 74 20 6a 29 7b 0a 20 20 69 6e 74 20 6e   int j){.  int n
3980: 4e 65 77 53 69 7a 65 20 3d 20 31 30 20 2d 20 70  NewSize = 10 - p
3990: 2d 3e 6e 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 61  ->nLabel;.  p->a
39a0: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
39b0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
39c0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
39d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39e0: 20 20 20 20 20 20 6e 4e 65 77 53 69 7a 65 2a 73        nNewSize*s
39f0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
3a00: 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  0]));.  if( p->a
3a10: 4c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Label==0 ){.    
3a20: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
3a30: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66   0;.  }else{.#if
3a40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3a50: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3a60: 66 6f 72 28 69 3d 70 2d 3e 6e 4c 61 62 65 6c 41  for(i=p->nLabelA
3a70: 6c 6c 6f 63 3b 20 69 3c 6e 4e 65 77 53 69 7a 65  lloc; i<nNewSize
3a80: 3b 20 69 2b 2b 29 20 70 2d 3e 61 4c 61 62 65 6c  ; i++) p->aLabel
3a90: 5b 69 5d 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66  [i] = -1;.#endif
3aa0: 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  .    p->nLabelAl
3ab0: 6c 6f 63 20 3d 20 6e 4e 65 77 53 69 7a 65 3b 0a  loc = nNewSize;.
3ac0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
3ad0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d   = v->nOp;.  }.}
3ae0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3af0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
3b00: 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20  be *v, int x){. 
3b10: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
3b20: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d  Parse;.  int j =
3b30: 20 41 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65   ADDR(x);.  asse
3b40: 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( v->magic==VD
3b50: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
3b60: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 2d 70 2d  .  assert( j<-p-
3b70: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73  >nLabel );.  ass
3b80: 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 23 69 66  ert( j>=0 );.#if
3b90: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3ba0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c  .  if( p->db->fl
3bb0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
3bc0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
3bd0: 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c     printf("RESOL
3be0: 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25  VE LABEL %d to %
3bf0: 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29  d\n", x, v->nOp)
3c00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
3c10: 66 28 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  f( p->nLabelAllo
3c20: 63 20 2b 20 70 2d 3e 6e 4c 61 62 65 6c 20 3c 20  c + p->nLabel < 
3c30: 30 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 52  0 ){.    resizeR
3c40: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 70 2c 76 2c  esolveLabel(p,v,
3c50: 6a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  j);.  }else{.   
3c60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62   assert( p->aLab
3c70: 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f  el[j]==(-1) ); /
3c80: 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c  * Labels may onl
3c90: 79 20 62 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e  y be resolved on
3ca0: 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61  ce */.    p->aLa
3cb0: 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b  bel[j] = v->nOp;
3cc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
3cd0: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
3ce0: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
3cf0: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
3d00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3d10: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
3d20: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
3d30: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
3d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74  .}../*.** Mark t
3d50: 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74  he VDBE as one t
3d60: 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  hat can only be 
3d70: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  run multiple tim
3d80: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
3d90: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
3da0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
3db0: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a  unOnlyOnce = 0;.
3dc0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
3dd0: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
3de0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
3df0: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
3e00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e10: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
3e20: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
3e30: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
3e40: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
3e50: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
3e60: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
3e70: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
3e80: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
3e90: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
3ea0: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
3eb0: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
3ec0: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
3ed0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
3ee0: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
3ef0: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
3f00: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
3f10: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
3f20: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
3f30: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
3f60: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
3f70: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
3f80: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
3f90: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
3fa0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
3fb0: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
3fc0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
3fd0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
3fe0: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
3ff0: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
4000: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
4010: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
4020: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
4050: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4060: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
4070: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
4080: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
4090: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
40a0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
40b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
40d0: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
40e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
4110: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
4120: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
4130: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
4150: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
4160: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
4170: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
4180: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
4190: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
41a0: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
41b0: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
41c0: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
41d0: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
41e0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
41f0: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
4200: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
4210: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
4220: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
4230: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
4240: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
4250: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
4260: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
4270: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
4280: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
4290: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
42a0: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
42b0: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
42c0: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
42d0: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
42e0: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
42f0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
4300: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
4310: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
4320: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
4330: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
4340: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
4350: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
4360: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
4370: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
4380: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
4390: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
43a0: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
43b0: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
43c0: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
43d0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
43e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
43f0: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
4400: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
4410: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
4420: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
4430: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
4440: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
4450: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
4460: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
4470: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4480: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
4490: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
44a0: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
44b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
44c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
44d0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
44e0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
44f0: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
4500: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
4510: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
4520: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
4530: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
4540: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
4550: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
4560: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
4570: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
4580: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
4590: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
45a0: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
45b0: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
45c0: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
45d0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
45e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
45f0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
4600: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
4610: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
4620: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
4630: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
4640: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
4650: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
4660: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
4670: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
4680: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
4690: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
46a0: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
46b0: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
46c0: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
46d0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
46e0: 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20  straint).**   * 
46f0: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2f   OP_CreateBtree/
4700: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64  BTREE_INTKEY and
4710: 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
4720: 65 20 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72 20  e .**      (for 
4730: 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 53 20  CREATE TABLE AS 
4740: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
4750: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
4760: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
4770: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
4780: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
4790: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
47a0: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
47b0: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
47c0: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
47d0: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
47e0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
47f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
4800: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
4810: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
4820: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
4830: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
4840: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
4850: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
4860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
4870: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
4880: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
4890: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
48a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
48b0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
48c0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
48d0: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
48e0: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e  sAbort = 0;.  in
48f0: 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d  t hasFkCounter =
4900: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65   0;.  int hasCre
4910: 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ateTable = 0;.  
4920: 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  int hasInitCorou
4930: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  tine = 0;.  Op *
4940: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
4950: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
4960: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
4970: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
4980: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
4990: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
49a0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
49b0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
49c0: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
49d0: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
49e0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
49f0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
4a00: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
4a10: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20  =OP_VRename .   
4a20: 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f    || opcode==OP_
4a30: 56 44 65 73 74 72 6f 79 0a 20 20 20 20 20 7c 7c  VDestroy.     ||
4a40: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e   (opcode==OP_Fun
4a50: 63 74 69 6f 6e 30 20 26 26 20 70 4f 70 2d 3e 70  ction0 && pOp->p
4a60: 34 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  4.pFunc->funcFla
4a70: 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49  gs&SQLITE_FUNC_I
4a80: 4e 54 45 52 4e 41 4c 29 0a 20 20 20 20 20 7c 7c  NTERNAL).     ||
4a90: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
4aa0: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
4ab0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
4ac0: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
4ad0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  )!=SQLITE_OK && 
4ae0: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
4af0: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
4b00: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
4b10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b20: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
4b30: 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  ==OP_CreateBtree
4b40: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52   && pOp->p3==BTR
4b50: 45 45 5f 49 4e 54 4b 45 59 20 29 20 68 61 73 43  EE_INTKEY ) hasC
4b60: 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a  reateTable = 1;.
4b70: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
4b80: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
4b90: 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74   ) hasInitCorout
4ba0: 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ine = 1;.#ifndef
4bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
4bc0: 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28  EIGN_KEY.    if(
4bd0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f   opcode==OP_FkCo
4be0: 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31  unter && pOp->p1
4bf0: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  ==0 && pOp->p2==
4c00: 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73 46 6b  1 ){.      hasFk
4c10: 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20  Counter = 1;.   
4c20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
4c30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
4c40: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
4c50: 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
4c60: 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74  true if hasAbort
4c70: 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69  ==mayAbort. Or i
4c80: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
4c90: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a  re occurred..  *
4ca0: 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  * If malloc fail
4cb0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69  ed, then the whi
4cc0: 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20  le() loop above 
4cd0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65  may not have ite
4ce0: 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75  rated.  ** throu
4cf0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61  gh all opcodes a
4d00: 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20  nd hasAbort may 
4d10: 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74  be set incorrect
4d20: 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20  ly. Return.  ** 
4d30: 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63 61  true for this ca
4d40: 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  se to prevent th
4d50: 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74 68  e assert() in th
4d60: 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a  e callers frame.
4d70: 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e    ** from failin
4d80: 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  g.  */.  return 
4d90: 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( v->db->mallocF
4da0: 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72  ailed || hasAbor
4db0: 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68  t==mayAbort || h
4dc0: 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20  asFkCounter.    
4dd0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 68 61            || (ha
4de0: 73 43 72 65 61 74 65 54 61 62 6c 65 20 26 26 20  sCreateTable && 
4df0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
4e00: 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ) );.}.#endif /*
4e10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20   SQLITE_DEBUG - 
4e20: 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65 72  the sqlite3Asser
4e30: 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63  tMayAbort() func
4e40: 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  tion */..#ifdef 
4e50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
4e60: 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
4e70: 20 6e 57 72 69 74 65 20 63 6f 75 6e 74 65 72 20   nWrite counter 
4e80: 69 6e 20 74 68 65 20 56 44 42 45 20 69 66 20 74  in the VDBE if t
4e90: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
4ea0: 20 61 6e 0a 2a 2a 20 65 70 68 65 6d 65 72 61 6c   an.** ephemeral
4eb0: 20 63 75 72 73 6f 72 2c 20 6f 72 20 69 66 20 74   cursor, or if t
4ec0: 68 65 20 63 75 72 73 6f 72 20 61 72 67 75 6d 65  he cursor argume
4ed0: 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76  nt is NULL..*/.v
4ee0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
4ef0: 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28  ncrWriteCounter(
4f00: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
4f10: 73 6f 72 20 2a 70 43 29 7b 0a 20 20 69 66 28 20  sor *pC){.  if( 
4f20: 70 43 3d 3d 30 0a 20 20 20 7c 7c 20 28 70 43 2d  pC==0.   || (pC-
4f30: 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
4f40: 50 45 5f 53 4f 52 54 45 52 0a 20 20 20 20 20 20  PE_SORTER.      
4f50: 20 26 26 20 70 43 2d 3e 65 43 75 72 54 79 70 65   && pC->eCurType
4f60: 21 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f  !=CURTYPE_PSEUDO
4f70: 0a 20 20 20 20 20 20 20 26 26 20 21 70 43 2d 3e  .       && !pC->
4f80: 69 73 45 70 68 65 6d 65 72 61 6c 29 0a 20 20 29  isEphemeral).  )
4f90: 7b 0a 20 20 20 20 70 2d 3e 6e 57 72 69 74 65 2b  {.    p->nWrite+
4fa0: 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  +;.  }.}.#endif.
4fb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4fc0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 73 65 72  EBUG./*.** Asser
4fd0: 74 20 69 66 20 61 6e 20 41 62 6f 72 74 20 61 74  t if an Abort at
4fe0: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
4ff0: 69 6d 65 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ime might result
5000: 20 69 6e 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a   in a corrupt.**
5010: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
5020: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  id sqlite3VdbeAs
5030: 73 65 72 74 41 62 6f 72 74 61 62 6c 65 28 56 64  sertAbortable(Vd
5040: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5050: 28 20 70 2d 3e 6e 57 72 69 74 65 3d 3d 30 20 7c  ( p->nWrite==0 |
5060: 7c 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  | p->usesStmtJou
5070: 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  rnal );.}.#endif
5080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5090: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
50a0: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
50b0: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
50c0: 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a  ted.  It loops.*
50d0: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  * through all th
50e0: 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69  e opcodes and fi
50f0: 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61  xes up some deta
5100: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46  ils..**.** (1) F
5110: 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73  or each jump ins
5120: 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20  truction with a 
5130: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
5140: 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20  e (a label).**  
5150: 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50     resolve the P
5160: 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63  2 value to an ac
5170: 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a  tual address..**
5180: 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20  .** (2) Compute 
5190: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
51a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
51b0: 75 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20  used by any SQL 
51c0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  function.**     
51d0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
51e0: 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e  alue in *pMaxFun
51f0: 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29  cArgs..**.** (3)
5200: 20 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65   Update the Vdbe
5210: 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64  .readOnly and Vd
5220: 62 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61  be.bIsReader fla
5230: 67 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  gs to accurately
5240: 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65  .**     indicate
5250: 20 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72   what the prepar
5260: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74  ed statement act
5270: 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a  ually does..**.*
5280: 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65  * (4) Initialize
5290: 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65   the p4.xAdvance
52a0: 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f   pointer on opco
52b0: 64 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e  des that use it.
52c0: 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61  .**.** (5) Recla
52d0: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  im the memory al
52e0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72  located for stor
52f0: 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a  ing labels..**.*
5300: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
5310: 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f  ill only functio
5320: 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74  n correctly if t
5330: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5340: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63   generator.** sc
5350: 72 69 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65  ript numbers the
5360: 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74   opcodes correct
5370: 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20  ly.  Changes to 
5380: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
5390: 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61  t be.** coordina
53a0: 74 65 64 20 77 69 74 68 20 63 68 61 6e 67 65 73  ted with changes
53b0: 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63   to mkopcodeh.tc
53c0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
53d0: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
53e0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
53f0: 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20  pMaxFuncArgs){. 
5400: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
5410: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
5420: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
5430: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
5440: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
5450: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
5460: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
5470: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
5480: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
5490: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  pOp = &p->aOp[p-
54a0: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65  >nOp-1];.  while
54b0: 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  (1){..    /* Onl
54c0: 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61  y JUMP opcodes a
54d0: 6e 64 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73  nd the short lis
54e0: 74 20 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63  t of special opc
54f0: 6f 64 65 73 20 69 6e 20 74 68 65 20 73 77 69 74  odes in the swit
5500: 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20  ch.    ** below 
5510: 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69  need to be consi
5520: 64 65 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70  dered.  The mkop
5530: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
5540: 74 6f 72 20 73 63 72 69 70 74 20 67 72 6f 75 70  tor script group
5550: 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65  s.    ** all the
5560: 73 65 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74  se opcodes toget
5570: 68 65 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f  her near the fro
5580: 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nt of the opcode
5590: 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20   list.  Skip.   
55a0: 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74   ** any opcode t
55b0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
55c0: 64 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  d processing by 
55d0: 76 69 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66  virtual of the f
55e0: 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
55f0: 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  it is larger tha
5600: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5610: 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65  _OPCODE, as a pe
5620: 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
5630: 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  zation..    */. 
5640: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
5650: 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55  de<=SQLITE_MX_JU
5660: 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20  MP_OPCODE ){.   
5670: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
5680: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
5690: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e  opcodeh.tcl when
56a0: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
56b0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73  ing.      ** cas
56c0: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
56d0: 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77  tch! */.      sw
56e0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
56f0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  e ){.        cas
5700: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
5710: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
5720: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
5730: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
5740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c            /* fal
5750: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
5760: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5770: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
5780: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5790: 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20  Savepoint: {.   
57a0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
57b0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
57c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
57d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
57e0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
57f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
5800: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
5810: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5820: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63  acuum:.        c
5830: 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  ase OP_JournalMo
5840: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  de: {.          
5850: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
5860: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49  .          p->bI
5870: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
5880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
58a0: 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20  case OP_Next:.  
58b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
58c0: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
58d0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
58e0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
58f0: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
5900: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5910: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
5920: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5930: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
5940: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
5950: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
5960: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
5970: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
5980: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
5990: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
59a0: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
59b0: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
59c0: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
59d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
59e0: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
59f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5a00: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
5a10: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
5a20: 76 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  v: {.          p
5a30: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
5a40: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
5a50: 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20  evious;.        
5a60: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5a70: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
5a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
5a90: 65 20 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65  e generator neve
5aa0: 72 20 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74  r codes any of t
5ab0: 68 65 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20  hese opcodes as 
5ac0: 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20  a jump.         
5ad0: 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20   ** to a label. 
5ae0: 20 54 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   They are always
5af0: 20 63 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70   coded as a jump
5b00: 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20   backwards to a 
5b10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e  .          ** kn
5b20: 6f 77 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  own address */. 
5b30: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5b40: 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20   pOp->p2>=0 );. 
5b50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5b60: 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65          }.#ifnde
5b70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
5b80: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
5b90: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
5ba0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  te: {.          
5bb0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
5bc0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
5bd0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
5be0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5bf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5c00: 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b  se OP_VFilter: {
5c10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
5c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
5c30: 72 74 28 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f  rt( (pOp - p->aO
5c40: 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20  p) >= 3 );.     
5c50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5c60: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
5c70: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
5c80: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
5c90: 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  .p1;.          i
5ca0: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
5cb0: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
5cc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
5cd0: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65  through into the
5ce0: 20 64 65 66 61 75 6c 74 20 63 61 73 65 20 2a 2f   default case */
5cf0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
5d00: 66 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  f.        defaul
5d10: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t: {.          i
5d20: 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  f( pOp->p2<0 ){.
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5d40: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5d50: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5d60: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5d70: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5d80: 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d           ** non-
5d90: 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65 73  jump opcodes les
5da0: 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58  s than SQLITE_MX
5db0: 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20 67  _JUMP_CODE are g
5dc0: 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
5dd0: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76 65           ** have
5de0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61   non-negative va
5df0: 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a  lues for P2. */.
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
5e10: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
5e20: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
5e30: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
5e40: 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20 20 20 20  JUMP)!=0 );.    
5e50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5e60: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 2d 70  ADDR(pOp->p2)<-p
5e70: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
5e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70  .            pOp
5e90: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44  ->p2 = aLabel[AD
5ea0: 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20  DR(pOp->p2)];.  
5eb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5ed0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5ee0: 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 63 6f     /* The mkopco
5ef0: 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 20 68  deh.tcl script h
5f00: 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 20 74  as so arranged t
5f10: 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 20 6f  hings that the o
5f20: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 6e  nly.      ** non
5f30: 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 6c 65  -jump opcodes le
5f40: 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  ss than SQLITE_M
5f50: 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 65 20  X_JUMP_CODE are 
5f60: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
5f70: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5f80: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5f90: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5fa0: 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65   assert( (sqlite
5fb0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
5fc0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f 50 46  pOp->opcode]&OPF
5fd0: 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c 20 70  LG_JUMP)==0 || p
5fe0: 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 20 20  Op->p2>=0);.    
5ff0: 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d 3d 70  }.    if( pOp==p
6000: 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20  ->aOp ) break;. 
6010: 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20     pOp--;.  }.  
6020: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
6030: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
6040: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
6050: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
6060: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
6070: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
6080: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
6090: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
60a0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
60b0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
60c0: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
60d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
60e0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
60f0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
6100: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
6110: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
6120: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
6130: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
6140: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6150: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
6160: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
6170: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
6180: 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70  at at least N op
6190: 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61  code slots are a
61a0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69  vailable in p wi
61b0: 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20  thout.** having 
61c0: 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f  to malloc for mo
61d0: 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70 74  re space (except
61e0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   when compiled u
61f0: 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  sing.** SQLITE_T
6200: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
6210: 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72  SS).  This inter
6220: 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75 72  face is used dur
6230: 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74  ing testing.** t
6240: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63 65  o verify that ce
6250: 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73  rtain calls to s
6260: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
6270: 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a  ist() can never.
6280: 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61  ** fail due to a
6290: 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68   OOM fault and h
62a0: 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72 65  ence that the re
62b0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a  turn value from.
62c0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
62d0: 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61  dOpList() will a
62e0: 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c  lways be non-NUL
62f0: 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  L..*/.#if define
6300: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
6310: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6320: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
6330: 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c  STRESS).void sql
6340: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
6350: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56  MallocRequired(V
6360: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
6370: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6380: 20 2b 20 4e 20 3c 3d 20 70 2d 3e 6e 4f 70 41 6c   + N <= p->nOpAl
6390: 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  loc );.}.#endif.
63a0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
63b0: 61 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  at the VM passed
63c0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
63d0: 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63  ument does not c
63e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f  ontain.** an OP_
63f0: 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
6400: 2e 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74  . Fail an assert
6410: 28 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54  () if it does. T
6420: 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62  his is used.** b
6430: 79 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61  y code in pragma
6440: 2e 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  .c to ensure tha
6450: 74 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  t the implementa
6460: 74 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a  tion of certain.
6470: 2a 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f  ** pragmas compo
6480: 72 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61  rts with the fla
6490: 67 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  gs specified in 
64a0: 74 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e  the mkpragmatab.
64b0: 74 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a  tcl.** script..*
64c0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
64d0: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21  LITE_DEBUG) && !
64e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
64f0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
6500: 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  SS).void sqlite3
6510: 56 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75  VdbeVerifyNoResu
6520: 6c 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a  ltRow(Vdbe *p){.
6530: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6540: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
6550: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
6560: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
6570: 21 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29  !=OP_ResultRow )
6580: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6590: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
65a0: 6f 64 65 20 28 61 20 73 69 6e 67 6c 65 20 4f 50  ode (a single OP
65b0: 5f 41 62 6f 72 74 61 62 6c 65 20 6f 70 63 6f 64  _Abortable opcod
65c0: 65 29 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20  e) that will.** 
65d0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
65e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 63 61 6e  VDBE program can
65f0: 20 73 61 66 65 6c 79 20 63 61 6c 6c 20 41 62 6f   safely call Abo
6600: 72 74 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  rt in the curren
6610: 74 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f  t.** context..*/
6620: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6630: 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64 20  ITE_DEBUG).void 
6640: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
6650: 79 41 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20  yAbortable(Vdbe 
6660: 2a 70 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  *p, int onError)
6670: 7b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  {.  if( onError=
6680: 3d 4f 45 5f 41 62 6f 72 74 20 29 20 73 71 6c 69  =OE_Abort ) sqli
6690: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
66a0: 20 4f 50 5f 41 62 6f 72 74 61 62 6c 65 29 3b 0a   OP_Abortable);.
66b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
66c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
66d0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
66e0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
66f0: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
6700: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
6710: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
6720: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6730: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
6740: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
6750: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
6760: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
6770: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
6780: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
6790: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
67a0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
67b0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
67c0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
67d0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
67e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
67f0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
6800: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
6810: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
6820: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
6830: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
6840: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
6850: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
6860: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6870: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
6880: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
6890: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
68a0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
68b0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
68c0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
68d0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
68e0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
68f0: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
6900: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
6910: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
6920: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
6930: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
6940: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
6950: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
6960: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
6970: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
6980: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
6990: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
69a0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
69b0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
69c0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
69d0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
69e0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
69f0: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
6a00: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
6a10: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
6a20: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
6a30: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a  ack.  Return a.*
6a40: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * pointer to the
6a50: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
6a60: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
6a70: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67   Non-zero P2 arg
6a80: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69  uments to jump i
6a90: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
6aa0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64  automatically ad
6ab0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61  justed.** so tha
6ac0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65  t the jump targe
6ad0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f  t is relative to
6ae0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
6af0: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  tion inserted..*
6b00: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6b10: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a  3VdbeAddOpList(.
6b20: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6b40: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f  * Add opcodes to
6b50: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
6b60: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
6b70: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   nOp,           
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6b90: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74  ber of opcodes t
6ba0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f  o add */.  VdbeO
6bb0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
6bc0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  ,       /* The o
6bd0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64  pcodes to be add
6be0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  ed */.  int iLin
6bf0: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  eno             
6c00: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66       /* Source-f
6c10: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ile line number 
6c20: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20  of first opcode 
6c30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
6c40: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a   VdbeOp *pOut, *
6c50: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74  pFirst;.  assert
6c60: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ( nOp>0 );.  ass
6c70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6c80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6c90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
6ca0: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
6cb0: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
6cc0: 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20  y(p, nOp) ){.   
6cd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6ce0: 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d   pFirst = pOut =
6cf0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d   &p->aOp[p->nOp]
6d00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
6d10: 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20  Op; i++, aOp++, 
6d20: 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75  pOut++){.    pOu
6d30: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d  t->opcode = aOp-
6d40: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75  >opcode;.    pOu
6d50: 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b  t->p1 = aOp->p1;
6d60: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20  .    pOut->p2 = 
6d70: 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73  aOp->p2;.    ass
6d80: 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20  ert( aOp->p2>=0 
6d90: 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  );.    if( (sqli
6da0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
6db0: 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26  y[aOp->opcode] &
6dc0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
6dd0: 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a  && aOp->p2>0 ){.
6de0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b        pOut->p2 +
6df0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
6e00: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61      pOut->p3 = a
6e10: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74  Op->p3;.    pOut
6e20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
6e30: 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d  TUSED;.    pOut-
6e40: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
6e50: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
6e60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6e70: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
6e80: 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  TS.    pOut->zCo
6e90: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
6ea0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
6eb0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
6ec0: 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65    pOut->iSrcLine
6ed0: 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65   = iLineno+i;.#e
6ee0: 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c  lse.    (void)iL
6ef0: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
6f00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6f10: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  G.    if( p->db-
6f20: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
6f30: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
6f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6f50: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
6f60: 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b  p->nOp, &p->aOp[
6f70: 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20  i+p->nOp]);.    
6f80: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  }.#endif.  }.  p
6f90: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
6fa0: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
6fb0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6fc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
6fd0: 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a  _SCANSTATUS)./*.
6fe0: 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
6ff0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
7000: 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64  counters managed
7010: 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   by sqlite3_stmt
7020: 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a  _scanstatus()..*
7030: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7040: 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  beScanStatus(.  
7050: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7070: 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61  /* VM to add sca
7080: 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a  nstatus() to */.
7090: 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
70a0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
70b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
70c0: 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
70d0: 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  ) */.  int addrL
70e0: 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
70f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
7100: 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  s of loop counte
7110: 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72  r */ .  int addr
7120: 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20  Visit,          
7130: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
7140: 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  ss of rows visit
7150: 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ed counter */.  
7160: 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20  LogEst nEst,    
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
7190: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
71a0: 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ws */.  const ch
71b0: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
71d0: 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  of table or inde
71e0: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
71f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
7200: 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 28 70  int64 nByte = (p
7210: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
7220: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
7230: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
7240: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
7250: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
7260: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
7270: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
7280: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
7290: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
72a0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
72b0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
72c0: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
72d0: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
72e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
72f0: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
7300: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
7310: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
7320: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
7330: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
7340: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
7350: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
7360: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
7370: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
7380: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
7390: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
73a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
73b0: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
73c0: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
73d0: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
73e0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
73f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7400: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
7410: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
7420: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
7430: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
7440: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
7450: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
7460: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
7470: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
7480: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
7490: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
74a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
74b0: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
74c0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
74d0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
74e0: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
74f0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
7500: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
7510: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
7520: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
7530: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
7540: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
7550: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
7560: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
7570: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
7580: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7590: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
75a0: 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73  p, u16 p5){.  as
75b0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
75c0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
75d0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
75e0: 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70  ->nOp>0 ) p->aOp
75f0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
7600: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  p5;.}../*.** Cha
7610: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
7620: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
7630: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
7640: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
7650: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
7660: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
7670: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
7680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7690: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
76a0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
76b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
76c0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
76d0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
76e0: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
76f0: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
7700: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
7710: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
7720: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
7730: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
7740: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
7750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7760: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
7770: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
7780: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
7790: 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d  f){.  if( (pDef-
77a0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
77b0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
77c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
77d0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44  3DbFreeNN(db, pD
77e0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
77f0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
7800: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
7810: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
7820: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
7830: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
7840: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
7850: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
7860: 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73  void freeP4Mem(s
7870: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20  qlite3 *db, Mem 
7880: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  *p){.  if( p->sz
7890: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
78a0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
78b0: 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65  alloc);.  sqlite
78c0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
78d0: 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54  ;.}.static SQLIT
78e0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
78f0: 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71  freeP4FuncCtx(sq
7900: 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74  lite3 *db, sqlit
7910: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a  e3_context *p){.
7920: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
7930: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70  unction(db, p->p
7940: 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44  Func);. sqlite3D
7950: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a  bFreeNN(db, p);.
7960: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
7970: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
7980: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
7990: 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72  id *p4){.  asser
79a0: 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63  t( db );.  switc
79b0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
79c0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
79d0: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  : {.      freeP4
79e0: 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c  FuncCtx(db, (sql
79f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
7a00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7a20: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65  4_REAL:.    case
7a30: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63   P4_INT64:.    c
7a40: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
7a50: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
7a60: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
7a70: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
7a80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7a90: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
7aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7ab0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
7ac0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7ad0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7ae0: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
7af0: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
7b00: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65  *)p4);.      bre
7b10: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
7b20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7b30: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
7b40: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
7b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7b60: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
7b70: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  r*)p4);.      br
7b80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7b90: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  f.    case P4_FU
7ba0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 66  NCDEF: {.      f
7bb0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
7bc0: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
7bd0: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  f*)p4);.      br
7be0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7bf0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7c00: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
7c10: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
7c20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
7c30: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
7c40: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
7c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7c60: 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c 20    freeP4Mem(db, 
7c70: 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20 20  (Mem*)p4);.     
7c80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7c90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7ca0: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
7cb0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
7cc0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
7cd0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
7ce0: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
7cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7d00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
7d10: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
7d20: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
7d30: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
7d40: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
7d50: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
7d60: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
7d70: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
7d80: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
7d90: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
7da0: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
7db0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
7dc0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
7dd0: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
7de0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
7df0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
7e00: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
7e10: 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70 4f  =&aOp[nOp-1]; pO
7e20: 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b 0a  p>=aOp; pOp--){.
7e30: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
7e40: 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45 45  4type <= P4_FREE
7e50: 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34 28  _IF_LE ) freeP4(
7e60: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
7e70: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
7e80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7e90: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7ea0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
7eb0: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
7ec0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
7ed0: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
7ee0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7ef0: 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a 7d  (db, aOp);.  }.}
7f00: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
7f10: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
7f20: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
7f30: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7f40: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
7f50: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
7f60: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
7f70: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
7f80: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
7f90: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
7fa0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
7fb0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
7fc0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
7fd0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
7fe0: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
7ff0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
8000: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
8010: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
8020: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
8030: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
8040: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8050: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
8060: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69  nto OP_Noop.*/.i
8070: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
8080: 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20  angeToNoop(Vdbe 
8090: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
80a0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
80b0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
80c0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
80d0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   0;.  assert( ad
80e0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
80f0: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
8100: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
8110: 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70   freeP4(p->db, p
8120: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
8130: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
8140: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
8150: 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ED;.  pOp->p4.z 
8160: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  = 0;.  pOp->opco
8170: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
8180: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
8190: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
81a0: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
81b0: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
81c0: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
81d0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
81e0: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
81f0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
8200: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
8210: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
8220: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
8230: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
8240: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
8250: 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e   p->nOp>0 && p->
8260: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70  aOp[p->nOp-1].op
8270: 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20  code==op ){.    
8280: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
8290: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70  beChangeToNoop(p
82a0: 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d  , p->nOp-1);.  }
82b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
82c0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
82d0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
82e0: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
82f0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
8300: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
8310: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8320: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
8330: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
8340: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
8350: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
8360: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
8370: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
8380: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
8390: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
83a0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
83b0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
83c0: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
83d0: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
83e0: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
83f0: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
8400: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
8410: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
8420: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
8430: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
8440: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
8450: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
8460: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
8470: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
8480: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
8490: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
84a0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
84b0: 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f  of zP4..** .** O
84c0: 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e  ther values of n
84d0: 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f   (P4_STATIC, P4_
84e0: 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e  COLLSEQ etc.) in
84f0: 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20  dicate that zP4 
8500: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73  points.** to a s
8510: 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75  tring or structu
8520: 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61  re that is guara
8530: 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66  nteed to exist f
8540: 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  or the lifetime 
8550: 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20  of.** the Vdbe. 
8560: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77  In these cases w
8570: 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20  e can just copy 
8580: 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  the pointer..**.
8590: 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65  ** If addr<0 the
85a0: 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74  n change P4 on t
85b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
85c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75   inserted instru
85d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
85e0: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49   void SQLITE_NOI
85f0: 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67 65  NLINE vdbeChange
8600: 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a  P4Full(.  Vdbe *
8610: 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20  p,.  Op *pOp,.  
8620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
8630: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66  .  int n.){.  if
8640: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
8650: 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64  .    freeP4(p->d
8660: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
8670: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
8680: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b  pOp->p4type = 0;
8690: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
86a0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c   0;.  }.  if( n<
86b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
86c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
86d0: 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61  (int)(pOp - p->a
86e0: 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  Op), zP4, n);.  
86f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
8700: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
8710: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
8720: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
8730: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8740: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
8750: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8760: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
8770: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
8780: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
8790: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
87a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
87b0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
87c0: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
87d0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
87e0: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
87f0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
8800: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
8810: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
8820: 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c  ert( p->aOp!=0 |
8830: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
8840: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
8850: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
8860: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
8870: 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c 20  AB ) freeP4(db, 
8880: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
8890: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72 65  **)&zP4);.    re
88a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
88b0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
88c0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
88d0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
88e0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
88f0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
8900: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
8910: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28  aOp[addr];.  if(
8920: 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34   n>=0 || pOp->p4
8930: 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62 65  type ){.    vdbe
8940: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20  ChangeP4Full(p, 
8950: 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  pOp, zP4, n);.  
8960: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8970: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
8980: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
8990: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
89a0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
89b0: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
89c0: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
89d0: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
89e0: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
89f0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
8a00: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
8a10: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
8a20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8a30: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
8a40: 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30 20  else if( zP4!=0 
8a50: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
8a60: 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 );.    pOp->p
8a70: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
8a80: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8a90: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
8aa0: 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50  )n;.    if( n==P
8ab0: 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65 33  4_VTAB ) sqlite3
8ac0: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
8ad0: 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  *)zP4);.  }.}../
8ae0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
8af0: 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P4 operand of th
8b00: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8b10: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
8b20: 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c  n .** to the val
8b30: 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ue defined by th
8b40: 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  e arguments.  Th
8b50: 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70 65  is is a high-spe
8b60: 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66  ed.** version of
8b70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8b80: 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  geP4()..**.** Th
8b90: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75 73  e P4 operand mus
8ba0: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
8bb0: 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69 6e  previously defin
8bc0: 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65 77  ed.  And the new
8bd0: 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74 20  .** P4 must not 
8be0: 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55 73  be P4_INT32.  Us
8bf0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
8c00: 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68 65  ngeP4() in eithe
8c10: 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61  r of.** those ca
8c20: 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ses..*/.void sql
8c30: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8c40: 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a  (Vdbe *p, void *
8c50: 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56  pP4, int n){.  V
8c60: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73  dbeOp *pOp;.  as
8c70: 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33  sert( n!=P4_INT3
8c80: 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  2 && n!=P4_VTAB 
8c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c 3d  );.  assert( n<=
8ca0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  0 );.  if( p->db
8cb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8cc0: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
8cd0: 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d  db, n, pP4);.  }
8ce0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
8cf0: 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20 20  ( pP4!=0 );.    
8d00: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
8d10: 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26 70   );.    pOp = &p
8d20: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
8d30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
8d40: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
8d50: 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d  USED );.    pOp-
8d60: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20  >p4type = n;.   
8d70: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34   pOp->p4.p = pP4
8d80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
8d90: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
8da0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8db0: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
8dc0: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
8dd0: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
8de0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8df0: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
8e00: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
8e10: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
8e20: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
8e30: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79  se->pVdbe;.  Key
8e40: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
8e50: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
8e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
8e70: 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66  !=0 );.  pKeyInf
8e80: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
8e90: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
8ea0: 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20 70  , pIdx);.  if( p
8eb0: 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74 65  KeyInfo ) sqlite
8ec0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
8ed0: 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45   pKeyInfo, P4_KE
8ee0: 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65  YINFO);.}..#ifde
8ef0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8f00: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
8f10: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
8f20: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
8f30: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
8f40: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
8f50: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
8f60: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
8f70: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
8f80: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
8f90: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
8fa0: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
8fb0: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
8fc0: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
8fd0: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
8fe0: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
8ff0: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
9000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
9010: 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  eVComment(Vdbe *
9020: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
9030: 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20  Format, va_list 
9040: 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ap){.  assert( p
9050: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f  ->nOp>0 || p->aO
9060: 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p==0 );.  assert
9070: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
9080: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
9090: 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70  zComment==0 || p
90a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
90b0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ed );.  if( p->n
90c0: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
90d0: 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20  ( p->aOp );.    
90e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
90f0: 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  >db, p->aOp[p->n
9100: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b  Op-1].zComment);
9110: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
9120: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d  Op-1].zComment =
9130: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
9140: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
9150: 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64   ap);.  }.}.void
9160: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
9170: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
9180: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
9190: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
91a0: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
91b0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
91c0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
91d0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
91e0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
91f0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
9200: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
9210: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
9220: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
9230: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
9240: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
9250: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
9260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9270: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
9280: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
9290: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76   zFormat);.    v
92a0: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a  dbeVComment(p, z
92b0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20  Format, ap);.   
92c0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
92d0: 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44  .}.#endif  /* ND
92e0: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
92f0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
9300: 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  RAGE./*.** Set t
9310: 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  he value if the 
9320: 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66  iSrcLine field f
9330: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  or the previousl
9340: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
9350: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9360: 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e  ite3VdbeSetLineN
9370: 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69  umber(Vdbe *v, i
9380: 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c  nt iLine){.  sql
9390: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
93a0: 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  -1)->iSrcLine = 
93b0: 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  iLine;.}.#endif 
93c0: 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  /* SQLITE_VDBE_C
93d0: 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a  OVERAGE */../*.*
93e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
93f0: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
9400: 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68 65  address.  If the
9410: 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20   address is -1, 
9420: 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74  then.** return t
9430: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9440: 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65   inserted opcode
9450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
9460: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
9470: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
9480: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63  d prior to the c
9490: 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a  alling of this.*
94a0: 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20  * routine, then 
94b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
94c0: 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c  ummy VdbeOp will
94d0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54   be returned.  T
94e0: 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73  hat opcode.** is
94f0: 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f   readable but no
9500: 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75  t writable, thou
9510: 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74 6f  gh it is cast to
9520: 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75   a writable valu
9530: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  e..** The return
9540: 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f   of a dummy opco
9550: 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61  de allows the ca
9560: 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66  ll to continue f
9570: 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66  unctioning.** af
9580: 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74  ter an OOM fault
9590: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
95a0: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
95b0: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
95c0: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
95d0: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
95e0: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
95f0: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
9600: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
9610: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
9620: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
9630: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
9640: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
9650: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
9660: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
9670: 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ind..*/.VdbeOp *
9680: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
9690: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
96a0: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70  dr){.  /* C89 sp
96b0: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65  ecifies that the
96c0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79   constant "dummy
96d0: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  " will be initia
96e0: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a  lized to all.  *
96f0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69  * zeros, which i
9700: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43  s correct.  MSVC
9710: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72   generates a war
9720: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65  ning, neverthele
9730: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ss. */.  static 
9740: 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f  VdbeOp dummy;  /
9750: 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56  * Ignore the MSV
9760: 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20  C warning about 
9770: 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  no initializer *
9780: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  /.  assert( p->m
9790: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
97a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61  _INIT );.  if( a
97b0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
97c0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
97d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
97e0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
97f0: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
9800: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
9810: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
9820: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9830: 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70    return (VdbeOp
9840: 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73  *)&dummy;.  }els
9850: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  e{.    return &p
9860: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d  ->aOp[addr];.  }
9870: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
9880: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
9890: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a  PLAIN_COMMENTS).
98a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
98b0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
98c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72  r one of the par
98d0: 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f  ameters to the o
98e0: 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74  pcode pOp.** det
98f0: 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61  ermined by chara
9900: 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69  cter c..*/.stati
9910: 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50  c int translateP
9920: 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f  (char c, const O
9930: 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63  p *pOp){.  if( c
9940: 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 70  =='1' ) return p
9950: 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d  Op->p1;.  if( c=
9960: 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='2' ) return pO
9970: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p2;.  if( c==
9980: 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '3' ) return pOp
9990: 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p3;.  if( c=='
99a0: 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  4' ) return pOp-
99b0: 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  >p4.i;.  return 
99c0: 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  pOp->p5;.}../*.*
99d0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
99e0: 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d  ng for the "comm
99f0: 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20  ent" field of a 
9a00: 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74  VDBE opcode list
9a10: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ing..**.** The S
9a20: 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69  ynopsis: field i
9a30: 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  n comments in th
9a40: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
9a50: 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72  file gets conver
9a60: 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74  ted.** to an ext
9a70: 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ra string that i
9a80: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
9a90: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
9aa0: 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a  ame().  In the.*
9ab0: 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68  * absence of oth
9ac0: 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69  er comments, thi
9ad0: 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d  s synopsis becom
9ae0: 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  es the comment o
9af0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a  n the opcode..**
9b00: 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f   Some translatio
9b10: 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20  n occurs:.**.** 
9b20: 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 20        "PX"      
9b30: 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20  ->  "r[X]".**   
9b40: 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e      "PX@PY"   ->
9b50: 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20    "r[X..X+Y-1]" 
9b60: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
9b70: 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20  is 0 or 1.**    
9b80: 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20     "PX@PY+1" -> 
9b90: 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20   "r[X..X+Y]"    
9ba0: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69  or "r[x]" if y i
9bb0: 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59  s 0.**       "PY
9bc0: 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e  ..PY"  ->  "r[X.
9bd0: 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b  .Y]"      or "r[
9be0: 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73  x]" if y<=x.*/.s
9bf0: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
9c00: 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73  yComment(.  cons
9c10: 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f  t Op *pOp,     /
9c20: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  * The opcode to 
9c30: 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a  be commented */.
9c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9c50: 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  4,   /* Previous
9c60: 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75  ly obtained valu
9c70: 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68  e for P4 */.  ch
9c80: 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20  ar *zTemp,      
9c90: 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
9ca0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
9cb0: 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Temp          /*
9cc0: 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
9cd0: 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29   in zTemp[] */.)
9ce0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
9cf0: 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74  zOpName;.  const
9d00: 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73   char *zSynopsis
9d10: 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b  ;.  int nOpName;
9d20: 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20  .  int ii, jj;. 
9d30: 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a   char zAlt[50];.
9d40: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
9d50: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
9d60: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
9d70: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
9d80: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
9d90: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
9da0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
9db0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
9dc0: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
9dd0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
9de0: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
9df0: 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73  e + 1;.    if( s
9e00: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
9e10: 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"IF ",3)==0 ){.
9e20: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
9e30: 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  5 & SQLITE_STORE
9e40: 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  P2 ){.        sq
9e50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9e60: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
9e70: 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29  t, "r[P2] = (%s)
9e80: 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b  ", zSynopsis+3);
9e90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9eb0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
9ec0: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25  lt), zAlt, "if %
9ed0: 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e  s goto P2", zSyn
9ee0: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9ef0: 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69  }.      zSynopsi
9f00: 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a  s = zAlt;.    }.
9f10: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
9f20: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
9f30: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
9f40: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
9f50: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
9f60: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
9f70: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
9f80: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
9f90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9fa0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9fb0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9fc0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
9fd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
9fe0: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
9ff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a000: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
a010: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
a020: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
a030: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
a040: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
a050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a060: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
a070: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
a080: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
a090: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a0a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
a0b0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
a0c0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
a0d0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
a0e0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
a0f0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
a100: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
a110: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
a120: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
a130: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
a140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
a150: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
a160: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
a170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
a180: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
a190: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
a1a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a1b0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
a1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
a1f0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
a200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
a210: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
a220: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
a230: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
a240: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a250: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
a260: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
a270: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
a280: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
a290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a2a0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
a2b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a2c0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
a2d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a2e0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
a2f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
a300: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
a310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a320: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
a330: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
a340: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
a350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a360: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
a370: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
a380: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
a390: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
a3a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a3b0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
a3c0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
a3d0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
a3e0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
a3f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
a400: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a410: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
a420: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
a430: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
a440: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a450: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
a460: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
a470: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
a480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
a490: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a4a0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23  LITE_DEBUG */..#
a4b0: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
a4c0: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
a4d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
a4e0: 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  OR_HINTS)./*.** 
a4f0: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34  Translate the P4
a500: 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72  .pExpr value for
a510: 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e   an OP_CursorHin
a520: 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65  t opcode into te
a530: 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62  xt.** that can b
a540: 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74  e displayed in t
a550: 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20  he P4 column of 
a560: 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a  EXPLAIN output..
a570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
a580: 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74 72  isplayP4Expr(Str
a590: 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a  Accum *p, Expr *
a5a0: 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20  pExpr){.  const 
a5b0: 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20  char *zOp = 0;. 
a5c0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
a5d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a5e0: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20  K_STRING:.      
a5f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a600: 6e 64 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78  ndf(p, "%Q", pEx
a610: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
a620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a630: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
a640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a650: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 25  tr_appendf(p, "%
a660: 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
a670: 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  lue);.      brea
a680: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
a690: 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL:.      sqlit
a6a0: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70  e3_str_appendf(p
a6b0: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
a6c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a6d0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
a6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a6f0: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 5b  r_appendf(p, "r[
a700: 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d]", pExpr->iTa
a710: 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
a720: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a730: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
a740: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a750: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
a760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
a770: 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 6f 77  _appendf(p, "row
a780: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
a790: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        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 63 25 64 22 2c 20 28 69 6e 74 29 70 45  , "c%d", (int)pE
a7c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
a7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a7e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a7f0: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
a800: 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20  Op = "LT";      
a810: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a820: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LE:      zOp 
a830: 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65  = "LE";      bre
a840: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a850: 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GT:      zOp = "
a860: 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GT";      break;
a870: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
a880: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22        zOp = "GE"
a890: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a8a0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
a8b0: 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20     zOp = "NE";  
a8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a8d0: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
a8e0: 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  zOp = "EQ";     
a8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a900: 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70   TK_IS:      zOp
a910: 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72   = "IS";      br
a920: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a930: 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20  _ISNOT:   zOp = 
a940: 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b  "ISNOT";   break
a950: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
a960: 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e  D:     zOp = "AN
a970: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
a980: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
a990: 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20      zOp = "OR"; 
a9a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9b0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
a9c0: 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20   zOp = "ADD";   
a9d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a9e0: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f  e TK_STAR:    zO
a9f0: 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62  p = "MUL";     b
aa00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa10: 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d  K_MINUS:   zOp =
aa20: 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61   "SUB";     brea
aa30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
aa40: 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52  EM:     zOp = "R
aa50: 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EM";     break;.
aa60: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
aa70: 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41  ND:  zOp = "BITA
aa80: 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ND";  break;.   
aa90: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
aaa0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b    zOp = "BITOR";
aab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
aac0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
aad0: 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20  Op = "DIV";     
aae0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
aaf0: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_LSHIFT:  zOp 
ab00: 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65  = "LSHIFT";  bre
ab10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab20: 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  RSHIFT:  zOp = "
ab30: 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  RSHIFT";  break;
ab40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
ab50: 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e  CAT:  zOp = "CON
ab60: 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  CAT";  break;.  
ab70: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
ab80: 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22  :  zOp = "MINUS"
ab90: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
aba0: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
abb0: 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20  zOp = "PLUS";   
abc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
abd0: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70   TK_BITNOT:  zOp
abe0: 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72   = "BITNOT";  br
abf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ac00: 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _NOT:     zOp = 
ac10: 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  "NOT";     break
ac20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
ac30: 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53  NULL:  zOp = "IS
ac40: 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NULL";  break;. 
ac50: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
ac60: 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55  LL: zOp = "NOTNU
ac70: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
ac80: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
ac90: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
aca0: 6e 64 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78  ndf(p, "%s", "ex
acb0: 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pr");.      brea
acc0: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f  k;.  }..  if( zO
acd0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
ace0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
acf0: 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20  "%s(", zOp);.   
ad00: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
ad10: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
ad20: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
ad30: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
ad40: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
ad50: 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20  nd(p, ",", 1);. 
ad60: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
ad70: 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69  pr(p, pExpr->pRi
ad80: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ght);.    }.    
ad90: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
ada0: 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20  nd(p, ")", 1);. 
adb0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56   }.}.#endif /* V
adc0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
add0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ade0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
adf0: 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56  INTS) */...#if V
ae00: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f  DBE_DISPLAY_P4./
ae10: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
ae20: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
ae30: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
ae40: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
ae50: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
ae60: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
ae70: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
ae80: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
ae90: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
aea0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
aeb0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
aec0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
aed0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74  P4 = zTemp;.  St
aee0: 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65  rAccum x;.  asse
aef0: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
af00: 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
af10: 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54  umInit(&x, 0, zT
af20: 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a  emp, nTemp, 0);.
af30: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
af40: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
af50: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
af60: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
af70: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
af80: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
af90: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
afa0: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
afb0: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
afc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
afd0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
afe0: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
aff0: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20 20  ->nKeyField);.  
b000: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
b010: 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65  KeyInfo->nKeyFie
b020: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
b030: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b040: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
b050: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
b060: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
b070: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
b080: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
b090: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
b0a0: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
b0b0: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
b0c0: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
b0d0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b0e0: 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 0a 20 20  &x, ",%s%s", .  
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
b100: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
b110: 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c  r[j] ? "-" : "",
b120: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d   zColl);.      }
b130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b140: 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 29  tr_append(&x, ")
b150: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
b160: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
b170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b180: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
b190: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a  case P4_EXPR: {.
b1a0: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
b1b0: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e  xpr(&x, pOp->p4.
b1c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72  pExpr);.      br
b1d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b1e0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  f.    case P4_CO
b1f0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
b200: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
b210: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
b220: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b230: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 28 25  _appendf(&x, "(%
b240: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
b250: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
b260: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b270: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
b280: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
b290: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
b2a0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
b2b0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b2c0: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
b2d0: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
b2e0: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
b2f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 64  eak;.    }.#if d
b300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b310: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
b320: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
b330: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
b340: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
b350: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
b360: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
b370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b380: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b390: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
b3a0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
b3b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b3c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
b3d0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
b3e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b3f0: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b400: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
b410: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
b420: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b430: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
b440: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b450: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 64  _appendf(&x, "%d
b460: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
b470: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b480: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
b490: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
b4a0: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
b4b0: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  &x, "%.16g", *pO
b4c0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
b4d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b4e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
b4f0: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
b500: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
b510: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
b520: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b530: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
b540: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
b550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
b560: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b570: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
b580: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b590: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70  df(&x, "%lld", p
b5a0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
b5b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
b5c0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
b5d0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
b5e0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b5f0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  (&x, "%.16g", pM
b600: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
b610: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
b620: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
b630: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
b640: 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20  = "NULL";.      
b650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
b660: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
b670: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
b680: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
b690: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
b6a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b6b0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
b6c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
b6d0: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
b6e0: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
b6f0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
b700: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
b710: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
b720: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b730: 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a 25  endf(&x, "vtab:%
b740: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
b750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b760: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
b770: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
b780: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
b790: 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e   int *ai = pOp->
b7a0: 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74  p4.ai;.      int
b7b0: 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a   n = ai[0];   /*
b7c0: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
b7d0: 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41  nt of an INTARRA
b7e0: 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a  Y is always the.
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b800: 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20         ** count 
b810: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b820: 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c   elements to fol
b830: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  low */.      for
b840: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
b850: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b860: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78  3_str_appendf(&x
b870: 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b  , ",%d", ai[i]);
b880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
b890: 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20  Temp[0] = '[';. 
b8a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b8b0: 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c  _append(&x, "]",
b8c0: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
b8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b8e0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
b8f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b900: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b910: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
b920: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b930: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42 4c     case P4_DYNBL
b940: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  OB:.    case P4_
b950: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
b960: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
b970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b980: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54 41  }.    case P4_TA
b990: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
b9a0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b9b0: 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  (&x, "%s", pOp->
b9c0: 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  p4.pTab->zName);
b9d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b9e0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
b9f0: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
ba00: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
ba10: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
ba20: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
ba30: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
ba40: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
ba50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
ba60: 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
ba70: 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74  sh(&x);.  assert
ba80: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
ba90: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
baa0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
bab0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
bac0: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
bad0: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
bae0: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
baf0: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
bb00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
bb10: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
bb20: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
bb30: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
bb40: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
bb50: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
bb60: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
bb70: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
bb80: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
bb90: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
bba0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
bbb0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
bbc0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
bbd0: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
bbe0: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
bbf0: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
bc00: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
bc10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bc20: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
bc30: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
bc40: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
bc50: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
bc60: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
bc70: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
bc80: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
bc90: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
bca0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
bcb0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
bcc0: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
bcd0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
bce0: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
bcf0: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
bd00: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
bd10: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
bd20: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
bd30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
bd40: 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20  ED_CACHE)./*.** 
bd50: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
bd60: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
bd70: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
bd80: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
bd90: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
bda0: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
bdb0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
bdc0: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
bdd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
bde0: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
bdf0: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
be00: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
be10: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
be20: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
be30: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
be40: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
be50: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
be60: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
be70: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
be80: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
be90: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
bea0: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
beb0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
bec0: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
bed0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
bee0: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
bef0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
bf00: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
bf10: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
bf20: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
bf30: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
bf40: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
bf50: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
bf60: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
bf70: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
bf80: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
bf90: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
bfa0: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
bfb0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
bfc0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
bfd0: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
bfe0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
bff0: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
c000: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
c010: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
c020: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
c030: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
c040: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
c050: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
c060: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
c070: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
c080: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
c090: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
c0a0: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
c0b0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
c0c0: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
c0d0: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
c0e0: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
c0f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
c100: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
c110: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
c120: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
c130: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
c140: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
c150: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
c160: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
c170: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
c180: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
c190: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
c1a0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
c1b0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
c1c0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
c1d0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
c1e0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
c1f0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
c200: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
c210: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
c220: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
c230: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
c240: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
c250: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
c260: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
c270: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c280: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
c290: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
c2a0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
c2b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
c2c0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
c2d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
c2e0: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
c2f0: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
c300: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
c310: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
c320: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
c330: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ()..*/.static SQ
c340: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
c350: 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62  id vdbeLeave(Vdb
c360: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
c370: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
c380: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
c390: 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  nDb;.  db = p->d
c3a0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
c3b0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
c3c0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
c3d0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
c3e0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
c3f0: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
c400: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
c410: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
c420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c430: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
c440: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
c450: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
c460: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
c470: 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  p){.  if( DbMask
c480: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
c490: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
c4a0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
c4b0: 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76  se */.  vdbeLeav
c4c0: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e(p);.}.#endif..
c4d0: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
c4e0: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
c4f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
c500: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
c510: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
c520: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c530: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
c540: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
c550: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
c560: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
c570: 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70 20   int pc, VdbeOp 
c580: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
c590: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
c5a0: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
c5b0: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
c5c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
c5d0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
c5e0: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
c5f0: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
c600: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
c610: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
c620: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
c630: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
c640: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
c650: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c660: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
c670: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
c680: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
c690: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
c6a0: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
c6b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
c6c0: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
c6d0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
c6e0: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
c6f0: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
c700: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
c710: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
c720: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
c730: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
c740: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
c750: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
c760: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
c770: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
c780: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
c790: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
c7a0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
c7b0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
c7c0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
c7d0: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
c7e0: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
c7f0: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
c800: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
c810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
c820: 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f  alize an array o
c830: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e  f N Mem element.
c840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c850: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d  initMemArray(Mem
c860: 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69   *p, int N, sqli
c870: 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61  te3 *db, u16 fla
c880: 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e  gs){.  while( (N
c890: 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  --)>0 ){.    p->
c8a0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e  db = db;.    p->
c8b0: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
c8c0: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
c8d0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
c8e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70  E_DEBUG.    p->p
c8f0: 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23  ScopyFrom = 0;.#
c900: 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20  endif.    p++;. 
c910: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
c920: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
c930: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
c940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
c950: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
c960: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
c970: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
c980: 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70    Mem *pEnd = &p
c990: 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [N];.    sqlite3
c9a0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
c9b0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
c9c0: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
c9d0: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
c9e0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
c9f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ca00: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
ca10: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
ca20: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
ca30: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
ca40: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
ca50: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
ca60: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
ca70: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
ca80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
ca90: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
caa0: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
cab0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
cac0: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
cad0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
cae0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
caf0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
cb00: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
cb10: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
cb20: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
cb30: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
cb40: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
cb50: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
cb60: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
cb70: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
cb80: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
cb90: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
cba0: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
cbb0: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
cbc0: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
cbd0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
cbe0: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
cbf0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
cc00: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
cc10: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
cc20: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
cc30: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
cc40: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
cc50: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
cc60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
cc70: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
cc80: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
cc90: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
cca0: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
ccb0: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
ccc0: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
ccd0: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
cce0: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
ccf0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
cd00: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
cd10: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
cd20: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
cd30: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
cd40: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
cd50: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
cd60: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
cd70: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
cd80: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
cd90: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
cda0: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
cdb0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
cdc0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
cdd0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
cde0: 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33 56  ->xDel==sqlite3V
cdf0: 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20 29  dbeFrameMemDel )
ce00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
ce10: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
ce20: 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20  M_Dyn) ){.      
ce30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
ce40: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
ce50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
ce60: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
ce70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ce80: 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  NN(db, p->zMallo
ce90: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
cea0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
ceb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
cec0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
ced0: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
cee0: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
cef0: 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51    }.}..#ifdef SQ
cf00: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
cf10: 20 56 65 72 69 66 79 20 74 68 61 74 20 70 46 72   Verify that pFr
cf20: 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20 56  ame is a valid V
cf30: 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74 65 72  dbeFrame pointer
cf40: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
cf50: 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20 66  f it is.** and f
cf60: 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  alse if somethin
cf70: 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  g is wrong..**.*
cf80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
cf90: 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  s intended for u
cfa0: 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  se inside of ass
cfb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
cfc0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71   only..*/.int sq
cfd0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 73  lite3VdbeFrameIs
cfe0: 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d 65 20  Valid(VdbeFrame 
cff0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66 28 20  *pFrame){.  if( 
d000: 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d 61  pFrame->iFrameMa
d010: 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52 41 4d  gic!=SQLITE_FRAM
d020: 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75 72 6e  E_MAGIC ) return
d030: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
d040: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
d050: 20 54 68 69 73 20 69 73 20 61 20 64 65 73 74 72   This is a destr
d060: 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20 6f  uctor on a Mem o
d070: 62 6a 65 63 74 20 28 77 68 69 63 68 20 69 73 20  bject (which is 
d080: 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74 65  really an sqlite
d090: 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61 74  3_value).** that
d0a0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 46 72 61   deletes the Fra
d0b0: 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  me object that i
d0c0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  s attached to it
d0d0: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a   as a blob..**.*
d0e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
d0f0: 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20 74  oes not delete t
d100: 68 65 20 46 72 61 6d 65 20 72 69 67 68 74 20 61  he Frame right a
d110: 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c 79 20  way.  It merely 
d120: 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72 61 6d  adds the.** fram
d130: 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 66  e to a list of f
d140: 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65 6c 65  rames to be dele
d150: 74 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62  ted when the Vdb
d160: 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69 64  e halts..*/.void
d170: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d180: 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70 41  eMemDel(void *pA
d190: 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61 6d 65  rg){.  VdbeFrame
d1a0: 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64 62 65   *pFrame = (Vdbe
d1b0: 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20 61  Frame*)pArg;.  a
d1c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
d1d0: 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 70  beFrameIsValid(p
d1e0: 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46 72 61  Frame) );.  pFra
d1f0: 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46  me->pParent = pF
d200: 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61  rame->v->pDelFra
d210: 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76 2d  me;.  pFrame->v-
d220: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 46 72  >pDelFrame = pFr
d230: 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  ame;.}.../*.** D
d240: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
d250: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
d260: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
d270: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
d280: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
d290: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
d2a0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
d2b0: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
d2c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
d2d0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
d2e0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
d2f0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
d300: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
d310: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
d320: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
d330: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
d340: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
d360: 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28  dbeFrameIsValid(
d370: 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p) );.  for(i=0;
d380: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
d390: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
d3a0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
d3b0: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
d3c0: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
d3d0: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
d3e0: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
d3f0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
d400: 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62  AuxData(p->v->db
d410: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
d420: 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  -1, 0);.  sqlite
d430: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
d440: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
d450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d460: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
d470: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
d480: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
d490: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
d4a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
d4b0: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
d4c0: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
d4d0: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
d4e0: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
d4f0: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
d500: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
d510: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
d520: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
d530: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
d540: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
d550: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
d560: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
d570: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
d580: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
d590: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
d5a0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
d5b0: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
d5c0: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
d5d0: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
d5e0: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
d5f0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
d600: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
d610: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
d620: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
d630: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
d640: 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49 6e   2018-04-24:  In
d650: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 6d   p->explain==2 m
d660: 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69 74  ode, the OP_Init
d670: 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69 67   opcodes of trig
d680: 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  gers.** are also
d690: 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74 20   shown, so that 
d6a0: 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20 62  the boundaries b
d6b0: 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e 20  etween the main 
d6c0: 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20 65  program and.** e
d6d0: 61 63 68 20 74 72 69 67 67 65 72 20 61 72 65 20  ach trigger are 
d6e0: 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  clear..**.** Whe
d6f0: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
d700: 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20   first the main 
d710: 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65  program is liste
d720: 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a  d, then each of.
d730: 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 73  ** the trigger s
d740: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c  ubprograms are l
d750: 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65  isted one by one
d760: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d770: 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65  VdbeList(.  Vdbe
d780: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
d790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
d7a0: 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  E */.){.  int nR
d7b0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7d0: 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20  * Stop when row 
d7e0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74 68  count reaches th
d7f0: 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  is */.  int nSub
d800: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d820: 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64  Number of sub-vd
d830: 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20  bes seen so far 
d840: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
d850: 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20  **apSub = 0;    
d860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
d870: 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  ay of sub-vdbes 
d880: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d  */.  Mem *pSub =
d890: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
d8b0: 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72  ory cell hold ar
d8c0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20  ray of subprogs 
d8d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d8e0: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
d8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d900: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d910: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tion */.  int i;
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d940: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
d950: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d960: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d970: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
d980: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
d990: 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65   *pMem = &p->aMe
d9a0: 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  m[1];           
d9b0: 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f    /* First Mem o
d9c0: 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  f result set */.
d9d0: 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70 72    int bListSubpr
d9e0: 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61 69  ogs = (p->explai
d9f0: 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c 61  n==1 || (db->fla
da00: 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69 67  gs & SQLITE_Trig
da10: 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20 4f  gerEQP)!=0);.  O
da20: 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20 61  p *pOp = 0;..  a
da30: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
da40: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
da50: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
da60: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
da70: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
da80: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
da90: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
daa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
dab0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
dac0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
dad0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
dae0: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
daf0: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
db00: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
db10: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
db20: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
db30: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
db40: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
db50: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
db60: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
db70: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
db80: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
db90: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
dba0: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
dbb0: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
dbc0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
dbd0: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
dbe0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
dbf0: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
dc00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
dc10: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
dc20: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
dc30: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
dc40: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
dc50: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
dc60: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
dc70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
dc80: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
dc90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
dca0: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
dcb0: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
dcc0: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
dcd0: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
dce0: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
dcf0: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
dd00: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
dd10: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
dd20: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
dd30: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
dd40: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
dd50: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
dd60: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
dd70: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
dd80: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
dd90: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
dda0: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
ddb0: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
ddc0: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
ddd0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
dde0: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
ddf0: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
de00: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
de10: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
de20: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
de30: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
de40: 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29 7b  bListSubprogs ){
de50: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
de60: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
de70: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
de80: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
de90: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
dea0: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
deb0: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
dec0: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
ded0: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
dee0: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
def0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
df00: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
df10: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
df20: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
df30: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
df40: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
df50: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
df60: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
df70: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
df80: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
df90: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
dfa0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
dfb0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
dfc0: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
dfd0: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
dfe0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
dff0: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
e000: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
e010: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
e020: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
e030: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
e040: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
e050: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
e060: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
e070: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
e080: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
e090: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
e0a0: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
e0b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
e0c0: 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c 6f  while(1){  /* Lo
e0d0: 6f 70 20 65 78 69 74 73 20 76 69 61 20 62 72 65  op exits via bre
e0e0: 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70 2d  ak */.    i = p-
e0f0: 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  >pc++;.    if( i
e100: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  >=nRow ){.      
e110: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
e120: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  K;.      rc = SQ
e130: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
e140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e150: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
e160: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
e170: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
e180: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
e190: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
e1a0: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
e1b0: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
e1c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
e1d0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
e1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
e1f0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
e200: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
e210: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
e220: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
e230: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
e240: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
e250: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
e260: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
e270: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
e280: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
e290: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
e2a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
e2b0: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
e2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
e2d0: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
e2e0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20  Op[i];.    }..  
e2f0: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
e300: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
e310: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
e320: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
e330: 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61 20 50  t has.    ** a P
e340: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
e350: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
e360: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
e370: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
e380: 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  ams.    ** kept 
e390: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
e3a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
e3b0: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
e3c0: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
e3d0: 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  am.    ** has no
e3e0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
e3f0: 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  een..    */.    
e400: 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f 67  if( bListSubprog
e410: 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65  s && pOp->p4type
e420: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
e430: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
e440: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
e450: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
e460: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
e470: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
e480: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
e490: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
e4a0: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
e4b0: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
e4c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
e4d0: 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ==nSub ){.      
e4e0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
e4f0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
e500: 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d  b, nByte, nSub!=
e510: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
e520: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
e530: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
e540: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e550: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e560: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e570: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
e580: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
e590: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70 53 75  >z;.        apSu
e5a0: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
e5b0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
e5c0: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
e5d0: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
e5e0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
e5f0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
e600: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
e610: 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d 3e     nRow += pOp->
e620: 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70  p4.pProgram->nOp
e630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e640: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
e650: 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  in<2 ) break;.  
e660: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e670: 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 20  e==OP_Explain ) 
e680: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
e690: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
e6a0: 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31 20 29  nit && p->pc>1 )
e6b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
e6c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e6d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
e6e0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
e6f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
e700: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
e710: 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  PT;.      rc = S
e720: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
e740: 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72  ror(p, sqlite3Er
e750: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
e760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
e770: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20 20  har *zP4;.      
e780: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
e790: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
e7a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
e7b0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
e7c0: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
e7f0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
e800: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
e810: 20 20 20 20 0a 20 20 20 20 20 20 20 20 70 4d 65      .        pMe
e820: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
e830: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
e840: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
e850: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pMem->z = (char*
e860: 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61  )sqlite3OpcodeNa
e870: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
e880: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
e890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
e8a0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
e8b0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
e8c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
e8d0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
e8e0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
e8f0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
e900: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 7d   pMem++;.      }
e910: 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ..      pMem->fl
e920: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e930: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e940: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
e970: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
e980: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e990: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
e9a0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
e9b0: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e9d0: 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  2 */.      pMem+
e9e0: 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  +;..      pMem->
e9f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
ea00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
ea10: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
ea40: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
ea50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
ea60: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
ea70: 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29  ize(pMem, 100) )
ea80: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
ea90: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
eaa0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
eab0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
eac0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ead0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
eae0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
eaf0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
eb00: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
eb10: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
eb20: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29   pMem->szMalloc)
eb30: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 21  ;.      if( zP4!
eb40: 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  =pMem->z ){.    
eb50: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b      pMem->n = 0;
eb60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eb70: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
eb80: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
eb90: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
eba0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ebb0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
ebc0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  >z!=0 );.       
ebd0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
ebe0: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
ebf0: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  >z);.        pMe
ec00: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ec10: 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTF8;.      }.  
ec20: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
ec30: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
ec40: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  n==1 ){.        
ec50: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
ec60: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
ec70: 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20  (pMem, 4) ){.   
ec80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ec90: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
eca0: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed );.          
ecb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
ecc0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
ecd0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
ece0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
ecf0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
ed00: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
ed10: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ed20: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
ed30: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
ed40: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
ed50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
ed60: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
ed70: 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20         pMem++;. 
ed80: 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
ed90: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
eda0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
edb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
edc0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
edd0: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b  ze(pMem, 500) ){
ede0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
edf0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
ee00: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ee10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ee20: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
ee30: 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d   }.        pMem-
ee40: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
ee50: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
ee60: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
ee70: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
ee80: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
ee90: 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  00);.        pMe
eea0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
eeb0: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
eec0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
eed0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
ef00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 0a  #endif.      }..
ef10: 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c        p->nResCol
ef20: 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e  umn = 8 - 4*(p->
ef30: 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20  explain-1);.    
ef40: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
ef50: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
ef60: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
ef70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63  ITE_OK;.      rc
ef80: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
ef90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
efa0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
efb0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
efc0: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
efd0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
efe0: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
eff0: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
f000: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
f010: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
f020: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
f030: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
f040: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
f050: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  z = 0;.  if( p->
f060: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20  zSql ){.    z = 
f070: 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65  p->zSql;.  }else
f080: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29   if( p->nOp>=1 )
f090: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65  {.    const Vdbe
f0a0: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
f0b0: 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f  p[0];.    if( pO
f0c0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
f0d0: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
f0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
f0f0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
f100: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
f110: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
f120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f130: 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51  ( z ) printf("SQ
f140: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
f150: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
f160: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f170: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
f180: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
f190: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
f1a0: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
f1b0: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
f1c0: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
f1d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
f1e0: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
f1f0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
f200: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
f210: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
f220: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
f230: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
f240: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
f250: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
f260: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
f270: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
f280: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
f290: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
f2a0: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
f2b0: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
f2c0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
f2d0: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
f2e0: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
f2f0: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
f300: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
f310: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
f320: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
f330: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
f340: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
f350: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
f360: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
f370: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
f380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f3a0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
f3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f3c0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
f3d0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
f3e0: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
f3f0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
f400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
f410: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
f420: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
f430: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
f440: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73   this object des
f450: 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f  cribes bulk memo
f460: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
f470: 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f   use.** by subco
f480: 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72  mponents of a pr
f490: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
f4a0: 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f  .  Space is allo
f4b0: 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20  cated out.** of 
f4c0: 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  a ReusableSpace 
f4d0: 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c  object by the al
f4e0: 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74 69  locSpace() routi
f4f0: 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72  ne below..*/.str
f500: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
f510: 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65  e {.  u8 *pSpace
f520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f530: 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  Available memory
f540: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
f550: 74 36 34 20 6e 46 72 65 65 3b 20 20 20 2f 2a 20  t64 nFree;   /* 
f560: 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  Bytes of availab
f570: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73  le memory */.  s
f580: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65  qlite3_int64 nNe
f590: 65 64 65 64 3b 20 2f 2a 20 54 6f 74 61 6c 20 62  eded; /* Total b
f5a0: 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20  ytes that could 
f5b0: 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
f5c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74   */.};../* Try t
f5d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  o allocate nByte
f5e0: 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65   bytes of 8-byte
f5f0: 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65   aligned bulk me
f600: 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a  mory for pBuf.**
f610: 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62   from the Reusab
f620: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20  leSpace object. 
f630: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
f640: 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
f650: 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20  ed.** memory on 
f660: 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73  success.  If ins
f670: 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79  ufficient memory
f680: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
f690: 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65   the.** Reusable
f6a0: 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e  Space object, in
f6b0: 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73 61  crease the Reusa
f6c0: 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64  bleSpace.nNeeded
f6d0: 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65  .** value by the
f6e0: 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61   amount needed a
f6f0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
f700: 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73  **.** If pBuf is
f710: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e   not initially N
f720: 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ULL, that means 
f730: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
f740: 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
f750: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  een allocated by
f760: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
f770: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73   this routine, s
f780: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  o just return a 
f790: 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20  copy.** of pBuf 
f7a0: 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 62  and leave Reusab
f7b0: 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65  leSpace unchange
f7c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  d..**.** This al
f7d0: 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f  locator is emplo
f7e0: 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65  yed to repurpose
f7f0: 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74   unused slots at
f800: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
f810: 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  ** opcode array 
f820: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
f830: 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f  e for other memo
f840: 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20  ry needs of the 
f850: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
f860: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
f870: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
f880: 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  e(.  struct Reus
f890: 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f  ableSpace *p,  /
f8a0: 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  * Bulk memory av
f8b0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
f8c0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
f8d0: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
f8e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
f8f0: 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f   to a prior allo
f900: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  cation */.  sqli
f910: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
f920: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
f930: 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
f940: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
f950: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
f960: 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20  MENT(p->pSpace) 
f970: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30  );.  if( pBuf==0
f980: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
f990: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
f9a0: 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20     if( nByte <= 
f9b0: 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  p->nFree ){.    
f9c0: 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42    p->nFree -= nB
f9d0: 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20  yte;.      pBuf 
f9e0: 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e  = &p->pSpace[p->
f9f0: 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73  nFree];.    }els
fa00: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65  e{.      p->nNee
fa10: 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  ded += nByte;.  
fa20: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
fa30: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
fa40: 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a  GNMENT(pBuf) );.
fa50: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
fa60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
fa70: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
fa80: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
fa90: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
faa0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
fab0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
fac0: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
fad0: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
fae0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
faf0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
fb00: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
fb10: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
fb20: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
fb30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
fb40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20  E_MAGIC_INIT || 
fb50: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
fb60: 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20  AGIC_RESET );.. 
fb70: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
fb80: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
fb90: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
fba0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
fbb0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
fbc0: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
fbd0: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
fbe0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
fbf0: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
fc00: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
fc10: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
fc20: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
fc30: 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
fc40: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
fc50: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
fc60: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
fc70: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
fc80: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
fc90: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
fca0: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
fcb0: 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  rt;.  p->nChange
fcc0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
fcd0: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
fce0: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
fcf0: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
fd00: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
fd10: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
fd20: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
fd30: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
fd40: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
fd50: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
fd60: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
fd70: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
fd80: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
fd90: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
fda0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
fdb0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
fdc0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
fdd0: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
fde0: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
fdf0: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
fe00: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
fe10: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
fe20: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
fe30: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
fe40: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
fe50: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
fe60: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
fe70: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
fe80: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
fe90: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
fea0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
feb0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
fec0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
fed0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
fee0: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
fef0: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
ff00: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
ff10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ff20: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
ff30: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
ff40: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
ff50: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
ff60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ff70: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
ff80: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
ff90: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
ffa0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
ffb0: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
ffc0: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
ffd0: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
ffe0: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
fff0: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
10000 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
10010 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
10020 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
10030 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
10040 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
10050 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
10060 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
10070 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
10080 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
10090 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
100a0 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
100b0 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
100c0 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
100d0 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
100e0 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
100f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10100 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
10110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10120 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
10130 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
10140 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
10150 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10160 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
10170 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
101a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
101b0 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
101e0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
101f0 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10210 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
10220 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
10230 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10260 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
10270 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
102a0 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
102b0 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
102c0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
102f0 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
10300 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20  leSpace x;      
10310 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75    /* Reusable bu
10320 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20  lk memory */..  
10330 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
10340 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
10350 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
10360 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
10370 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
10380 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
10390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
103a0 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
103b0 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
103c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
103d0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
103e0 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
103f0 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
10400 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
10410 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
10420 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
10430 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
10440 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68  rg;.  .  /* Each
10450 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d   cursor uses a m
10460 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65  emory cell.  The
10470 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63   first cursor (c
10480 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a  ursor 0) can.  *
10490 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68  * use aMem[0] wh
104a0 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  ich is not other
104b0 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65  wise used by the
104c0 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
104d0 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70  Allocate.  ** sp
104e0 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
104f0 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72  f aMem[] for cur
10500 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74  sors 1 and great
10510 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73  er..  ** See als
10520 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
10530 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
10540 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69   += nCursor;.  i
10550 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26  f( nCursor==0 &&
10560 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b   nMem>0 ) nMem++
10570 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20  ;  /* Space for 
10580 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20  aMem[0] even if 
10590 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  not used */..  /
105a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
105b0 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d   much reusable m
105c0 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
105d0 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  le at the end of
105e0 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65   the.  ** opcode
105f0 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78   array.  This ex
10600 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  tra memory will 
10610 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66  be reallocated f
10620 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74  or other element
10630 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72  s.  ** of the pr
10640 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10650 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
10660 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
10670 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
10680 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
10690 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75   opcode memory u
106a0 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63  sed */.  x.pSpac
106b0 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f  e = &((u8*)p->aO
106c0 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20  p)[n];          
106d0 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f       /* Unused o
106e0 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  pcode memory */.
106f0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
10700 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78  BYTE_ALIGNMENT(x
10710 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e  .pSpace) );.  x.
10720 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
10730 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
10740 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
10750 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d  ytes of unused m
10760 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
10770 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b  t( x.nFree>=0 );
10780 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
10790 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
107a0 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65  &x.pSpace[x.nFre
107b0 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  e]) );..  resolv
107c0 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
107d0 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
107e0 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
107f0 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
10800 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
10810 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
10820 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
10830 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
10840 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
10850 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20   }.  p->expired 
10860 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
10870 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
10880 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
10890 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
108a0 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72  ocated in one or
108b0 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
108c0 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
108d0 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
108e0 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d  reuse unused mem
108f0 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ory at the .  **
10900 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
10910 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
10920 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
10930 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
10940 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
10950 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
10960 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
10970 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
10980 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
10990 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
109a0 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67   remainder using
109b0 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20   a fresh memory 
109c0 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
109d0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
109e0 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
109f0 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
10a00 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
10a10 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
10a20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d  the leftover mem
10a30 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ory at the end o
10a40 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
10a50 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69  ay.  This can si
10a60 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
10a70 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
10a80 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
10a90 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
10aa0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
10ab0 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b    x.nNeeded = 0;
10ac0 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c  .  p->aMem = all
10ad0 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e  ocSpace(&x, 0, n
10ae0 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
10af0 3b 0a 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c  ;.  p->aVar = al
10b00 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10b10 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
10b20 29 3b 0a 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  );.  p->apArg = 
10b30 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30  allocSpace(&x, 0
10b40 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
10b50 6d 2a 29 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72  m*));.  p->apCsr
10b60 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10b70 2c 20 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  , 0, nCursor*siz
10b80 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
10b90 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
10ba0 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
10bb0 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45  NSTATUS.  p->anE
10bc0 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
10bd0 28 26 78 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73  (&x, 0, p->nOp*s
10be0 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e  izeof(i64));.#en
10bf0 64 69 66 0a 20 20 69 66 28 20 78 2e 6e 4e 65 65  dif.  if( x.nNee
10c00 64 65 64 20 29 7b 0a 20 20 20 20 78 2e 70 53 70  ded ){.    x.pSp
10c10 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d  ace = p->pFree =
10c20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10c30 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65  RawNN(db, x.nNee
10c40 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65  ded);.    x.nFre
10c50 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20  e = x.nNeeded;. 
10c60 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
10c70 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10c80 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
10c90 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d  cSpace(&x, p->aM
10ca0 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
10cb0 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Mem));.      p->
10cc0 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
10cd0 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20 6e  e(&x, p->aVar, n
10ce0 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Var*sizeof(Mem))
10cf0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67  ;.      p->apArg
10d00 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10d10 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  , p->apArg, nArg
10d20 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a  *sizeof(Mem*));.
10d30 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d        p->apCsr =
10d40 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10d50 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
10d60 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
10d70 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53  sor*));.#ifdef S
10d80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
10d90 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
10da0 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61     p->anExec = a
10db0 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
10dc0 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a  >anExec, p->nOp*
10dd0 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
10de0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
10df0 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50    p->pVList = pP
10e00 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20  arse->pVList;.  
10e10 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d  pParse->pVList =
10e20 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69    0;.  p->explai
10e30 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
10e40 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ain;.  if( db->m
10e50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10e60 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a     p->nVar = 0;.
10e70 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
10e80 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20   0;.    p->nMem 
10e90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10ea0 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
10eb0 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e  Cursor;.    p->n
10ec0 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
10ed0 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72  r;.    initMemAr
10ee0 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ray(p->aVar, nVa
10ef0 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  r, db, MEM_Null)
10f00 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  ;.    p->nMem = 
10f10 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65  nMem;.    initMe
10f20 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
10f30 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e  nMem, db, MEM_Un
10f40 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65  defined);.    me
10f50 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30  mset(p->apCsr, 0
10f60 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
10f70 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
10f80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10f90 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
10fa0 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28  ATUS.    memset(
10fb0 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d  p->anExec, 0, p-
10fc0 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29  >nOp*sizeof(i64)
10fd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
10fe0 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
10ff0 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
11000 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
11010 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
11020 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
11030 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
11040 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
11050 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11060 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
11070 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
11080 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
11090 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
110a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
110b0 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d  ert( pCx->pBtx==
110c0 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79  0 || pCx->eCurTy
110d0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
110e0 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  E );.  switch( p
110f0 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a  Cx->eCurType ){.
11100 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
11110 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20  _SORTER: {.     
11120 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
11130 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
11140 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Cx);.      break
11150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11160 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20   CURTYPE_BTREE: 
11170 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d  {.      if( pCx-
11180 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  >isEphemeral ){.
11190 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78 2d          if( pCx-
111a0 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33 42  >pBtx ) sqlite3B
111b0 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
111c0 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Btx);.        /*
111d0 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
111e0 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
111f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
11200 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
11210 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
11220 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
11230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11240 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e     assert( pCx->
11250 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
11260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11270 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
11280 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72  (pCx->uc.pCursor
11290 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
112a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
112b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
112c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
112d0 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
112e0 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
112f0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
11300 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e  r *pVCur = pCx->
11310 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20  uc.pVCur;.      
11320 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
11330 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
11340 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d  pVCur->pVtab->pM
11350 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73  odule;.      ass
11360 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61  ert( pVCur->pVta
11370 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
11380 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d     pVCur->pVtab-
11390 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70  >nRef--;.      p
113a0 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
113b0 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65  VCur);.      bre
113c0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
113d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
113e0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
113f0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
11400 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
11410 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72  void closeCursor
11420 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70  sInFrame(Vdbe *p
11430 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ){.  if( p->apCs
11440 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
11450 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11460 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
11470 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
11480 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
11490 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
114a0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
114b0 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
114c0 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
114d0 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
114e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
114f0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
11500 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
11510 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
11520 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
11530 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
11540 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
11550 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
11560 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
11570 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
11580 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
11590 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
115a0 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
115b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
115c0 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
115d0 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
115e0 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
115f0 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72  e->v;.  closeCur
11600 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a  sorsInFrame(v);.
11610 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11620 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
11630 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
11640 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
11650 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
11660 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
11670 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
11680 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
11690 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
116a0 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
116b0 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
116c0 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
116d0 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
116e0 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
116f0 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
11700 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
11710 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
11720 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
11730 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
11740 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e  ;.  v->db->nChan
11750 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62  ge = pFrame->nDb
11760 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65  Change;.  sqlite
11770 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
11780 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41  ta(v->db, &v->pA
11790 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
117a0 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20    v->pAuxData = 
117b0 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
117c0 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  ;.  pFrame->pAux
117d0 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75  Data = 0;.  retu
117e0 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
117f0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
11800 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
11810 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
11820 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
11830 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
11840 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
11850 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
11860 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
11870 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
11880 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
11890 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
118a0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
118b0 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
118c0 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
118d0 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
118e0 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
118f0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
11900 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
11910 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
11920 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
11930 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
11940 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
11950 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
11960 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
11970 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
11980 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
11990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
119a0 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
119b0 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d  e);.    p->pFram
119c0 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46  e = 0;.    p->nF
119d0 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rame = 0;.  }.  
119e0 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d  assert( p->nFram
119f0 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43  e==0 );.  closeC
11a00 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29  ursorsInFrame(p)
11a10 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
11a20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
11a30 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20  mArray(p->aMem, 
11a40 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  p->nMem);.  }.  
11a50 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72  while( p->pDelFr
11a60 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
11a70 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e  rame *pDel = p->
11a80 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70  pDelFrame;.    p
11a90 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44  ->pDelFrame = pD
11aa0 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  el->pParent;.   
11ab0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
11ac0 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20  eDelete(pDel);. 
11ad0 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
11ae0 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f  any auxdata allo
11af0 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20  cations made by 
11b00 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20  the VM */.  if( 
11b10 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71  p->pAuxData ) sq
11b20 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
11b30 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70  uxData(p->db, &p
11b40 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
11b50 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0);.  assert( p-
11b60 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a  >pAuxData==0 );.
11b70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11b80 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
11b90 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
11ba0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
11bb0 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
11bc0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
11bd0 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
11be0 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
11bf0 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
11c00 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
11c10 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
11c20 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
11c30 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
11c40 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
11c50 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
11c60 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
11c70 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
11c80 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
11c90 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
11ca0 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
11cb0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
11cc0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
11cd0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73  ;..  if( p->nRes
11ce0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65  Column ){.    re
11cf0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
11d00 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
11d10 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
11d20 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  _N);.    sqlite3
11d30 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
11d40 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e  olName);.  }.  n
11d50 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
11d60 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
11d70 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
11d80 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
11d90 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d  >aColName = (Mem
11da0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
11db0 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
11dc0 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
11dd0 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
11de0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69   ) return;.  ini
11df0 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  tMemArray(p->aCo
11e00 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45  lName, n, db, ME
11e10 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  M_Null);.}../*.*
11e20 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
11e30 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
11e40 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
11e50 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
11e60 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
11e70 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
11e80 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
11e90 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
11ea0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
11eb0 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
11ec0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
11ed0 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
11ee0 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
11ef0 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
11f00 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
11f10 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
11f20 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
11f30 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
11f40 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
11f50 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
11f60 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
11f70 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
11f80 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
11f90 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
11fa0 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
11fb0 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
11fc0 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
11fd0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
11fe0 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
11ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
12010 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
12020 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12050 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
12060 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
12070 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
120a0 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
120b0 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
120c0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
120d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
120e0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
120f0 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
12100 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
12110 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
12120 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
12130 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
12140 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
12150 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
12160 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
12170 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
12180 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
12190 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
121a0 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
121b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
121c0 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
121d0 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
121e0 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
121f0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
12200 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12210 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12220 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
12230 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
12240 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
12250 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
12260 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
12270 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
12280 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
12290 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
122a0 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
122b0 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
122c0 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
122d0 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
122e0 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
122f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
12300 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
12310 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
12320 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
12330 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
12340 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
12350 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
12360 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
12370 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
12380 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
12390 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
123a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
123b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
123c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
123d0 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
123e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
123f0 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
12400 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
12410 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
12420 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
12430 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
12440 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
12450 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
12460 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
12470 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20  -transaction.   
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64  ** that are cand
124a0 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f  idates for a two
124b0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73  -phase commit us
124c0 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20  ing a.          
124d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74           ** mast
124e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er-journal */.  
124f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12500 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
12510 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
12520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12530 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
12540 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
12550 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
12560 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
12570 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
12580 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
12590 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
125a0 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
125b0 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
125c0 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
125d0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
125e0 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
125f0 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
12600 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
12610 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
12620 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
12630 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
12640 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
12650 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
12660 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
12670 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
12680 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
12690 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
126a0 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
126b0 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
126c0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
126d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
126e0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
126f0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
12700 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
12710 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
12720 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
12730 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
12740 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
12750 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
12760 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
12770 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
12780 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
12790 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
127a0 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
127b0 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
127c0 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
127d0 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
127e0 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
127f0 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
12800 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
12810 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
12820 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
12830 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
12840 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
12850 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
12860 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
12870 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
12880 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
12890 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
128a0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
128b0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
128c0 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
128d0 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
128e0 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61   or not a databa
128f0 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  se might need a 
12900 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
12910 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20  epends upon.    
12920 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c    ** its journal
12930 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68   mode (among oth
12940 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69  er things).  Thi
12950 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69  s matrix determi
12960 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  nes which.      
12970 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  ** journal modes
12980 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f   use a master jo
12990 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20  urnal and which 
129a0 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  do not */.      
129b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
129c0 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a  aMJNeeded[] = {.
129d0 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54          /* DELET
129e0 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20  E   */  1,.     
129f0 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20     /* PERSIST   
12a00 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
12a10 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c   OFF       */ 0,
12a20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e  .        /* TRUN
12a30 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20  CATE  */ 1,.    
12a40 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20      /* MEMORY   
12a50 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
12a60 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30  * WAL       */ 0
12a70 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
12a80 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
12a90 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69   /* Pager associ
12aa0 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f  ated with pBt */
12ab0 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
12ac0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  it = 1;.      sq
12ad0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12ae0 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pBt);.      pPag
12af0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
12b00 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
12b10 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
12b20 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ].safety_level!=
12b30 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
12b40 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20  S_OFF.       && 
12b50 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65  aMJNeeded[sqlite
12b60 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
12b70 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20  Mode(pPager)].  
12b80 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
12b90 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61 67  agerIsMemdb(pPag
12ba0 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 20  er)==0.      ){ 
12bb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12bc0 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   i!=1 );.       
12bd0 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
12be0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
12bf0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
12c00 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
12c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
12c20 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
12c30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
12c40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12c50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12c60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
12c70 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
12c80 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
12c90 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
12ca0 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
12cb0 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
12cc0 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
12cd0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
12ce0 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
12cf0 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
12d00 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
12d10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
12d20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
12d30 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
12d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12d50 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
12d60 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
12d70 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
12d80 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
12d90 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
12da0 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
12db0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
12dc0 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
12dd0 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
12de0 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
12df0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
12e00 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
12e10 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
12e20 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
12e30 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
12e40 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
12e50 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
12e60 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
12e70 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
12e80 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
12e90 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
12ea0 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
12eb0 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
12ec0 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
12ed0 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
12ee0 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
12ef0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
12f00 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
12f10 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
12f20 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
12f30 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
12f40 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
12f50 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
12f60 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
12f70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
12f80 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12f90 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12fa0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12fc0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
12fd0 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
12fe0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
12ff0 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
13000 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
13010 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
13020 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
13030 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
13040 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
13050 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
13060 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
13070 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
13080 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
13090 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
130a0 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
130b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
130c0 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
130d0 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
130e0 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
130f0 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
13100 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
13110 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
13120 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
13130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13140 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
13150 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
13160 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
13170 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
13180 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
13190 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
131a0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
131b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
131c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
131d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
131e0 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
131f0 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
13200 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
13210 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
13220 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
13230 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
13240 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
13250 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
13260 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13270 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
13280 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
13290 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
132a0 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
132b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
132c0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
132d0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
132e0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
132f0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72  ->pVfs;.    char
13300 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
13310 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
13320 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
13330 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
13340 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
13350 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
13360 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
13370 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
13380 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
13390 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
133a0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
133b0 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
133c0 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
133d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
133e0 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
133f0 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
13400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
13410 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
13420 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
13430 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
13440 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
13450 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
13460 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
13470 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
13480 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
13490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
134a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
134b0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
134c0 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
134d0 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
134e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
134f0 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
13500 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
13510 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
13520 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
13530 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
13540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13550 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
13560 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
13570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13590 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
135a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
135b0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
135c0 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
135d0 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
135e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
135f0 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
13600 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
13610 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
13620 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
13630 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
13640 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
13650 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
13660 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
13670 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
136a0 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
136b0 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
136c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
136d0 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
136e0 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
136f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
13700 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
13710 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
13720 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
13730 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
13740 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
13750 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
13760 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
13770 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
13780 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
13790 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
137a0 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
137b0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
137c0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
137d0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
137e0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
137f0 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
13800 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
13810 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
13820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
13840 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
13850 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
13860 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13870 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
13880 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
13890 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
138a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
138b0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
138c0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
138d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
138e0 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
138f0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
13900 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
13910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
13940 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
13950 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13960 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
13970 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
13980 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
13990 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
139a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
139b0 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
139c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
139d0 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
139e0 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
139f0 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
13a00 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
13a10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13a20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
13a30 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
13a40 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
13a50 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
13a60 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
13a70 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
13a80 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
13a90 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
13aa0 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
13ab0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
13ac0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
13ad0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
13ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
13af0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
13b00 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
13b10 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
13b20 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
13b30 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
13b40 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
13b50 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
13b60 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
13b70 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
13b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
13b90 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
13ba0 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
13bb0 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
13bc0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
13bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
13be0 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
13bf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13c00 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
13c10 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
13c20 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
13c30 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
13c40 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
13c50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13c60 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
13c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13c90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
13ca0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
13cb0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
13cc0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
13cd0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
13ce0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13cf0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
13d00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13d10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13d20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13d30 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
13d40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
13d50 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
13d60 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
13d70 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
13d80 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
13d90 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
13da0 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69      if( 0==(sqli
13db0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
13dc0 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
13dd0 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
13de0 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
13df0 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
13e00 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
13e10 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
13e20 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
13e30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
13e40 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
13e50 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
13e60 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
13e70 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
13e80 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
13e90 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
13ea0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
13eb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
13ec0 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
13ed0 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
13ee0 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
13ef0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
13f00 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
13f10 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
13f20 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
13f30 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
13f40 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
13f50 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
13f60 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
13f70 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13f80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
13f90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
13fa0 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
13fb0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
13fc0 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
13fd0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
13fe0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
13ff0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
14000 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
14010 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
14020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
14030 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
14040 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
14050 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
14060 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
14070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
14080 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
14090 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
140a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
140b0 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
140c0 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
140d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
140e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
140f0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
14100 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
14110 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
14120 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
14130 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14140 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14150 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
14160 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
14170 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
14180 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
14190 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
141a0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
141b0 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
141c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
141d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
141e0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
141f0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
14200 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
14210 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
14220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14230 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
14240 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
14250 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
14260 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
14270 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
14280 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
14290 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
142a0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
142b0 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
142c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
142d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
142e0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
142f0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
14300 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
14310 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
14320 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
14330 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
14340 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
14350 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
14360 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
14370 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
14380 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
14390 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
143a0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
143b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
143c0 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
143d0 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
143e0 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
143f0 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
14400 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
14410 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
14420 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
14430 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
14440 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
14450 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
14460 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
14470 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
14480 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
14490 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
144a0 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
144b0 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
144c0 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
144d0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
144e0 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
144f0 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
14500 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
14510 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
14520 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
14530 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14540 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
14550 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14560 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
14570 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
14580 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
14590 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
145a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
145b0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
145c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
145d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
145e0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
145f0 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
14600 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
14610 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
14620 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
14630 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
14640 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
14650 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
14660 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
14670 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
14680 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
14690 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
146a0 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
146b0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
146c0 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
146d0 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
146e0 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
146f0 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
14700 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
14710 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
14720 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
14730 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
14740 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
14750 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
14760 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
14770 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
14780 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
14790 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
147a0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
147b0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
147c0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
147d0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
147e0 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
147f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
14800 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
14810 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
14820 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
14830 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
14840 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
14850 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
14860 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
14870 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
14880 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
14890 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
148a0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
148b0 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
148c0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
148d0 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
148e0 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
148f0 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
14900 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
14910 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
14920 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
14930 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
14940 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
14950 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
14960 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
14970 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
14980 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
14990 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
149a0 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
149b0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
149c0 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
149d0 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
149e0 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
149f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
14a00 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
14a10 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
14a20 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14a30 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
14a40 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
14a50 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
14a60 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
14a70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
14a80 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
14a90 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14aa0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
14ab0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
14ac0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
14ad0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
14ae0 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
14af0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
14b00 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
14b10 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  OK..*/.static SQ
14b20 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
14b30 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  t vdbeCloseState
14b40 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
14b50 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
14b60 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
14b70 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
14b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
14b90 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   i;.  const int 
14ba0 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
14bb0 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
14bc0 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
14bd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14be0 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
14bf0 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61  NT_RELEASE);.  a
14c00 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
14c10 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
14c20 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
14c30 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
14c40 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
14c50 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  nt) );..  for(i=
14c60 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
14c70 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 32  +){ .    int rc2
14c80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14c90 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
14ca0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
14cb0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
14cc0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
14cd0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14ce0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
14cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
14d00 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
14d10 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
14d20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
14d30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
14d40 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
14d50 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73  .        rc2 = s
14d60 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
14d70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
14d80 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
14d90 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
14da0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
14db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14dc0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
14dd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14de0 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
14df0 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  t--;.  p->iState
14e00 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ment = 0;..  if(
14e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14e20 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  {.    if( eOp==S
14e30 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14e40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
14e50 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
14e60 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
14e70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
14e80 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
14e90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
14eb0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
14ec0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
14ed0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
14ee0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
14ef0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
14f00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
14f10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
14f20 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
14f30 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
14f40 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
14f50 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
14f60 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
14f70 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
14f80 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
14f90 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
14fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
14fb0 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 69   opened.  */.  i
14fc0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
14fd0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14fe0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
14ff0 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
15000 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  fCons;.    db->n
15010 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
15020 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d  = p->nStmtDefImm
15030 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cons;.  }.  retu
15040 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15050 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
15060 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
15070 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28 20  int eOp){.  if( 
15080 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  p->db->nStatemen
15090 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
150a0 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
150b0 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d   vdbeCloseStatem
150c0 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20 7d  ent(p, eOp);.  }
150d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
150e0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
150f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15100 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72  called when a tr
15110 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
15120 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65   by the database
15130 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f   .** handle asso
15140 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
15150 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
15160 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75  argument is abou
15170 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d  t to be .** comm
15180 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20  itted. If there 
15190 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
151a0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
151b0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
151c0 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72  ** violations, r
151d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
151e0 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  OR. Otherwise, S
151f0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
15200 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
15210 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c  standing FK viol
15220 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20  ations and this 
15230 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
15240 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
15250 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  R, set the resul
15260 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53  t of the VM to S
15270 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
15280 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61  _FOREIGNKEY.** a
15290 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  nd write an erro
152a0 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e  r message to it.
152b0 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   Then return SQL
152c0 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69  ITE_ERROR..*/.#i
152d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
152e0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e  T_FOREIGN_KEY.in
152f0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  t sqlite3VdbeChe
15300 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e  ckFk(Vdbe *p, in
15310 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73  t deferred){.  s
15320 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
15330 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72  db;.  if( (defer
15340 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66  red && (db->nDef
15350 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44  erredCons+db->nD
15360 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e  eferredImmCons)>
15370 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65  0) .   || (!defe
15380 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f  rred && p->nFkCo
15390 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29  nstraint>0) .  )
153a0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
153b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
153c0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
153d0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
153e0 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
153f0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
15400 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20  p, "FOREIGN KEY 
15410 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
15420 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
15430 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15440 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15450 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
15460 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15470 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
15480 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
15490 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
154a0 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
154b0 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
154c0 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
154d0 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
154e0 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
154f0 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
15500 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
15510 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
15520 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
15530 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
15540 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
15550 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
15560 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
15570 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
15580 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
15590 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
155a0 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
155b0 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
155c0 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
155d0 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
155e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
155f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
15600 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
15610 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
15620 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
15630 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
15640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
15650 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
15660 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
15670 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
15680 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
15690 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
156a0 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
156b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
156c0 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
156d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f    /* Used to sto
15700 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74  re transient ret
15710 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73  urn codes */.  s
15720 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
15730 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  db;..  /* This f
15740 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
15750 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
15760 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
15770 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
15780 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
15790 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
157a0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
157b0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
157c0 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
157d0 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
157e0 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
157f0 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
15800 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
15810 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
15820 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
15830 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
15840 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
15850 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
15860 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
15870 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
15880 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
15890 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
158a0 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
158b0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
158c0 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
158d0 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
158e0 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
158f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
15900 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
15910 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
15920 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
15930 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
15940 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
15950 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
15960 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
15970 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
15980 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15990 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
159a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
159b0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
159c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
159d0 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  PT;.  }.  closeA
159e0 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
159f0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
15a00 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
15a10 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
15a20 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
15a30 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
15a40 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
15a50 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
15a60 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
15a70 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
15a80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
15a90 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
15aa0 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
15ab0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
15ac0 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
15ad0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
15ae0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
15af0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
15b00 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
15b10 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
15b20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
15b30 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
15b40 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
15b50 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
15b60 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
15b70 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
15b80 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
15b90 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
15ba0 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
15bb0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
15bc0 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
15bd0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
15be0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
15bf0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
15c00 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
15c10 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
15c20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
15c30 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
15c40 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
15c50 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
15c60 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
15c70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
15c80 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
15c90 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
15ca0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
15cb0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
15cc0 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
15cd0 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
15ce0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
15cf0 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
15d00 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
15d10 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
15d20 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
15d30 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
15d40 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
15d50 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
15d60 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
15d70 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
15d80 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
15d90 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
15da0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
15db0 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
15dc0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
15dd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
15de0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
15df0 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
15e00 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
15e10 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
15e20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
15e30 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
15e40 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
15e50 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
15e60 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
15e70 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
15e80 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
15e90 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
15ea0 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
15eb0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
15ec0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
15ed0 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
15ee0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
15ef0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
15f00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15f10 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
15f20 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
15f30 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
15f40 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
15f50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
15f60 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
15f70 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
15f80 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
15f90 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
15fa0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
15fb0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
15fc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15fd0 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
15fe0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
15ff0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
16000 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
16010 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
16020 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
16030 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
16040 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
16050 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
16060 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
16070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16080 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16090 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
160a0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
160b0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
160c0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
160d0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
160e0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
160f0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
16100 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
16110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
16120 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
16130 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
16140 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
16150 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
16160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16180 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
16190 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
161a0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
161b0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
161c0 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
161d0 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
161e0 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
161f0 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
16200 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
16210 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
16220 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
16230 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16240 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
16250 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
16260 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
16270 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
16280 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
16290 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
162a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
162b0 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
162c0 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
162d0 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
162e0 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
162f0 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  te==(p->readOnly
16300 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
16310 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16320 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
16330 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
16340 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
16350 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
16360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
16370 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
16380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
163a0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
163b0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
163c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
163d0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
163e0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
163f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
16400 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
16410 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16420 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
16430 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
16440 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20        }else{ .  
16450 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
16460 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
16470 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
16480 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
16490 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
164a0 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e      ** or hit an
164b0 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74   'OR FAIL' const
164c0 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20  raint and there 
164d0 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20  are no deferred 
164e0 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20  foreign.        
164f0 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61    ** key constra
16500 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20  ints to hold up 
16510 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16520 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
16530 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  mmit .          
16540 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
16550 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
16560 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
16570 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
16580 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16590 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d  QLITE_BUSY && p-
165a0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
165b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
165c0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
165d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
165e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
165f0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
16600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16610 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
16620 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
16630 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
16640 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
16650 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
16660 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
16670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16680 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
16690 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
166a0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
166b0 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
166c0 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
166d0 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 54  s &= ~(u64)SQLIT
166e0 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
166f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
16700 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
16710 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
16720 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
16740 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
16750 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
16760 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
16770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16780 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
16790 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
167a0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
167b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
167c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
167d0 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
167e0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
167f0 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
16800 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
16810 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
16820 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
16830 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
16840 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
16850 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
16860 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
16870 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16880 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
16890 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
168a0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
168b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
168c0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
168d0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
168e0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
168f0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
16900 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16910 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
16920 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
16930 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
16940 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
16950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
16960 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
16970 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
16980 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
16990 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
169a0 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
169b0 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
169c0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
169d0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
169e0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
169f0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
16a00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
16a10 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
16a20 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
16a30 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
16a40 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
16a50 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
16a60 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
16a70 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
16a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
16a90 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
16aa0 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
16ab0 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
16ac0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16ad0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16ae0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
16af0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
16b00 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
16b10 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
16b20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
16b30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16b40 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
16b50 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
16b60 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
16b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16b80 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
16b90 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
16ba0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
16bb0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
16bc0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
16bd0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
16be0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
16bf0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
16c00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16c10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16c20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
16c30 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
16c40 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
16c50 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
16c60 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
16c70 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
16c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
16c90 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
16ca0 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
16cb0 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
16cc0 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
16cd0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
16ce0 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
16cf0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
16d00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
16d10 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
16d20 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
16d30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
16d40 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
16d50 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
16d60 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
16d70 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
16d80 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
16d90 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
16da0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
16db0 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
16dc0 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
16dd0 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
16de0 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
16df0 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
16e00 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
16e10 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
16e20 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
16e30 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
16e40 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
16e50 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
16e60 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
16e70 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
16e80 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
16e90 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
16ea0 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
16eb0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
16ec0 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
16ed0 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
16ee0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
16ef0 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
16f00 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
16f10 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
16f20 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
16f30 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  (db);.  if( db->
16f40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16f50 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16f60 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
16f70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16f80 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
16f90 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
16fa0 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
16fb0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
16fc0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
16fd0 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
16fe0 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
16ff0 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
17000 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
17010 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
17020 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
17030 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
17040 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
17050 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
17060 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
17070 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
17080 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
17090 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
170a0 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
170b0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
170c0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
170d0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
170e0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
170f0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
17100 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
17110 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
17120 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
17130 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
17140 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
17150 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
17160 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
17170 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
17180 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
17190 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
171a0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
171b0 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
171c0 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
171d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
171e0 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
171f0 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
17200 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
17210 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
17220 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
17230 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
17240 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
17250 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
17260 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
17270 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
17280 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
17290 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
172a0 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
172b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
172c0 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
172d0 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
172e0 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
172f0 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
17300 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
17310 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
17320 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
17330 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
17340 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
17350 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
17360 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
17370 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
17380 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  {.    db->bBenig
17390 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73  nMalloc++;.    s
173a0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
173b0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
173c0 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
173d0 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
173e0 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
173f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
17400 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
17410 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
17420 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
17430 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
17440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
17450 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
17460 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
17470 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 65  alloc--;.  }else
17480 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b   if( db->pErr ){
17490 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
174a0 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 72  eSetNull(db->pEr
174b0 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 72  r);.  }.  db->er
174c0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 65  rCode = rc;.  re
174d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
174e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
174f0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
17500 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
17510 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
17520 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
17530 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
17540 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
17550 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
17560 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
17570 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
17580 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
17590 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
175a0 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
175b0 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
175c0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
175d0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
175e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
175f0 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
17600 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
17610 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
17620 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
17630 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
17640 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
17650 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
17660 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17670 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
17680 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
17690 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
176a0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
176b0 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
176c0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
176d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
176e0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
176f0 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
17700 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
17710 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
17720 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
17730 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
17740 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
17750 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
17760 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
17770 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
17780 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
17790 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
177a0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
177b0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
177c0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
177d0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
177e0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
177f0 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
17800 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
17810 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
17820 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
17830 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
17840 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
17850 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
17860 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
17870 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
17880 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
17890 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
178a0 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
178b0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
178c0 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
178d0 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
178e0 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  i;.#endif..  sql
178f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
17900 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
17910 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
17920 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
17930 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
17940 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
17950 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
17960 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
17970 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
17980 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
17990 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
179a0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
179b0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
179c0 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20 72   VDBE has been r
179d0 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
179e0 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
179f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
17a00 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
17a10 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
17a20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
17a30 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
17a40 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
17a50 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
17a60 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
17a70 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
17a80 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
17a90 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
17aa0 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
17ab0 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
17ac0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
17ad0 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
17ae0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
17af0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
17b00 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
17b10 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
17b20 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
17b30 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
17b40 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
17b50 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
17b60 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
17b70 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
17b80 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
17b90 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
17ba0 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
17bb0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
17bc0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
17bd0 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
17be0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
17bf0 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
17c00 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
17c10 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
17c20 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
17c30 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
17c40 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
17c50 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
17c60 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  sg(db, p->rc, p-
17c70 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
17c80 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
17c90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65  ;.  }..  /* Rese
17ca0 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65  t register conte
17cb0 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d 20  nts and reclaim 
17cc0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 65  error message me
17cd0 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  mory..  */.#ifde
17ce0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
17cf0 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65   /* Execute asse
17d00 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
17d10 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
17d20 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20  he Vdbe.apCsr[] 
17d30 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61  and .  ** Vdbe.a
17d40 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76  Mem[] arrays hav
17d50 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
17d60 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20  leaned up.  */. 
17d70 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
17d80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
17d90 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
17da0 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
17db0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
17dc0 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
17dd0 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
17de0 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
17df0 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
17e00 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
17e10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
17e20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
17e30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
17e40 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
17e50 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
17e60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17e70 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 74  DEBUG.  p->nWrit
17e80 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  e = 0;.#endif.. 
17e90 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
17ea0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
17eb0 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
17ec0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
17ed0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
17ee0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
17ef0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
17f00 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
17f10 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
17f20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17f30 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
17f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
17f50 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
17f60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17f70 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
17f80 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
17f90 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
17fa0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
17fb0 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
17fc0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
17fd0 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
17fe0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
17ff0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
18000 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
18010 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
18020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18030 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
18040 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
18050 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
18060 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
18070 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
18080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
18090 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
180a0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
180b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
180c0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
180d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
180e0 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
180f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
18100 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
18110 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
18120 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
18130 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
18140 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
18150 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
18160 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
18170 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
18180 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
18190 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
181a0 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
181b0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
181c0 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
181d0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
181e0 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
181f0 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
18200 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
18210 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
18220 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18230 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
18240 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a  BE_MAGIC_RESET;.
18250 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
18260 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
18270 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
18280 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
18290 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
182a0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
182b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
182c0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
182d0 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
182e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
182f0 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
18300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18310 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
18320 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
18330 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
18340 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
18350 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
18360 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18370 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
18380 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
18390 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
183a0 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
183b0 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
183c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
183d0 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
183e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
183f0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
18400 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
18410 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
18420 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
18430 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
18440 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
18450 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
18460 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
18470 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
18480 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18490 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
184a0 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
184b0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
184c0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
184d0 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
184e0 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
184f0 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
18500 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
18510 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
18520 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
18530 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
18540 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
18550 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
18560 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
18570 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
18580 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
18590 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
185a0 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
185b0 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
185c0 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
185d0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
185e0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
185f0 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
18600 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
18610 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
18620 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
18630 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
18640 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
18650 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
18660 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
18670 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
18680 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
18690 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20  AuxData(sqlite3 
186a0 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70  *db, AuxData **p
186b0 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  p, int iOp, int 
186c0 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20  mask){.  while( 
186d0 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61  *pp ){.    AuxDa
186e0 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a  ta *pAux = *pp;.
186f0 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a      if( (iOp<0).
18700 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69       || (pAux->i
18710 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 20  AuxOp==iOp.     
18720 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 41       && pAux->iA
18730 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 20  uxArg>=0.       
18740 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 75     && (pAux->iAu
18750 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73  xArg>31 || !(mas
18760 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41  k & MASKBIT32(pA
18770 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 0a  ux->iAuxArg)))).
18780 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
18790 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 75  tcase( pAux->iAu
187a0 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20  xArg==31 );.    
187b0 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
187c0 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 20  eteAux ){.      
187d0 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41    pAux->xDeleteA
187e0 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  ux(pAux->pAux);.
187f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
18800 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 41  p = pAux->pNextA
18810 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ux;.      sqlite
18820 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78  3DbFree(db, pAux
18830 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18840 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
18850 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a 20  NextAux;.    }. 
18860 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
18870 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
18880 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
18890 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
188a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
188b0 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
188c0 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
188d0 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
188e0 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
188f0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
18900 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18910 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
18920 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
18930 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
18940 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
18950 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
18960 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
18970 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
18980 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
18990 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
189a0 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
189b0 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
189c0 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
189d0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
189e0 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
189f0 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
18a00 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ext;.  assert( p
18a10 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
18a20 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
18a30 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
18a40 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
18a50 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
18a60 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
18a70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
18a80 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
18a90 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
18aa0 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
18ab0 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
18ac0 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
18ad0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
18ae0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
18af0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d 61  .  }.  if( p->ma
18b00 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
18b10 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c 65  INIT ){.    rele
18b20 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
18b30 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
18b40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18b50 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 3b  (db, p->pVList);
18b60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18b70 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
18b80 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65  ;.  }.  vdbeFree
18b90 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
18ba0 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
18bb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18bc0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
18bd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18be0 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66  b, p->zSql);.#if
18bf0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18c00 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73 71  E_NORMALIZE.  sq
18c10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18c20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 20 20  p->zNormSql);.  
18c30 7b 0a 20 20 20 20 44 62 6c 71 75 6f 74 65 53 74  {.    DblquoteSt
18c40 72 20 2a 70 54 68 69 73 2c 20 2a 70 4e 65 78 74  r *pThis, *pNext
18c50 3b 0a 20 20 20 20 66 6f 72 28 70 54 68 69 73 3d  ;.    for(pThis=
18c60 70 2d 3e 70 44 62 6c 53 74 72 3b 20 70 54 68 69  p->pDblStr; pThi
18c70 73 3b 20 70 54 68 69 73 3d 70 4e 65 78 74 29 7b  s; pThis=pNext){
18c80 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
18c90 54 68 69 73 2d 3e 70 4e 65 78 74 53 74 72 3b 0a  This->pNextStr;.
18ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
18cb0 72 65 65 28 64 62 2c 20 70 54 68 69 73 29 3b 0a  ree(db, pThis);.
18cc0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
18cd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18ce0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
18cf0 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 69 6e  TATUS.  {.    in
18d00 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
18d10 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
18d20 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
18d30 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18d40 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
18d50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18d60 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18d70 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Scan);.  }.#endi
18d80 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  f.}../*.** Delet
18d90 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
18da0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18db0 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
18dc0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
18dd0 2a 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  *db;..  assert( 
18de0 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
18df0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
18e00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18e10 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
18e20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
18e30 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
18e40 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
18e50 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
18e60 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
18e70 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
18e80 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
18e90 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
18ea0 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
18eb0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
18ec0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
18ed0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
18ee0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
18ef0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
18f00 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
18f10 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
18f20 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
18f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
18f40 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
18f50 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
18f60 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
18f70 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
18f80 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
18f90 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
18fa0 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
18fb0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
18fc0 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
18fd0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
18fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
18ff0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
19000 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
19010 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
19020 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
19030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19040 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
19050 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
19060 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
19070 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
19080 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
19090 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
190a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
190b0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
190c0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
190d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
190e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
190f0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
19100 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
19110 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
19120 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19130 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
19140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19150 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
19160 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
19170 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
19180 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
19190 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
191a0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
191b0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
191c0 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
191d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
191e0 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
191f0 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
19200 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
19210 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
19220 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
19230 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
19240 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
19250 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
19260 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
19270 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
19280 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
19290 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
192a0 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
192b0 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
192c0 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
192d0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
192e0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
192f0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
19300 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
19310 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
19320 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
19330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
19340 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
19350 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
19360 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
19370 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
19380 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
19390 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
193a0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
193b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
193c0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
193d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
193e0 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
193f0 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
19400 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
19410 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19420 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
19430 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
19440 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
19450 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
19460 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
19470 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
19480 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
19490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
194a0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
194b0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
194c0 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
194d0 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
194e0 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
194f0 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
19500 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
19510 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
19520 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
19530 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
19540 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
19550 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
19560 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19570 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
19580 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
19590 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
195a0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
195b0 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
195c0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
195d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
195e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
195f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
19600 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
19610 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
19620 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
19630 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
19640 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
19650 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
19660 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
19670 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
19680 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
19690 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
196a0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
196b0 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
196c0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
196d0 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
196e0 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
196f0 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
19700 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
19710 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
19720 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
19730 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
19740 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
19750 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
19760 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
19770 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
19780 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
19790 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
197a0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
197b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
197c0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
197d0 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
197e0 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
197f0 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
19800 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
19810 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
19820 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
19830 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
19840 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
19850 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
19860 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
19870 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
19880 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
19890 20 3d 20 2a 70 70 3b 0a 20 20 61 73 73 65 72 74   = *pp;.  assert
198a0 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
198b0 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20  URTYPE_BTREE || 
198c0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
198d0 54 59 50 45 5f 50 53 45 55 44 4f 20 29 3b 0a 20  TYPE_PSEUDO );. 
198e0 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
198f0 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e  Moveto ){.    in
19900 74 20 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20  t iMap;.    if( 
19910 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69  p->aAltMap && (i
19920 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70  Map = p->aAltMap
19930 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b  [1+*piCol])>0 ){
19940 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
19950 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  pAltCursor;.    
19960 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20    *piCol = iMap 
19970 2d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  - 1;.      retur
19980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19990 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61   }.    return ha
199a0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
199b0 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  to(p);.  }.  if(
199c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
199d0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
199e0 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
199f0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
19a00 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
19a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19a20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19a30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
19a40 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
19a50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19a60 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
19a70 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
19a80 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
19a90 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
19aa0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
19ab0 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
19ac0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19ad0 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
19ae0 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
19af0 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
19b00 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
19b10 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
19b20 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
19b30 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
19b40 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
19b50 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
19b60 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
19b70 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
19b80 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
19b90 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
19ba0 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
19bb0 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
19bc0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
19bd0 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
19be0 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
19bf0 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
19c00 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
19c10 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
19c20 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
19c30 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
19c40 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
19c50 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
19c60 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
19c70 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19c80 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
19c90 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
19ca0 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
19cb0 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
19cc0 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
19cd0 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
19ce0 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
19cf0 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
19d00 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a   separately..**.
19d10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19d20 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
19d30 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
19d40 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
19d50 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
19d60 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
19d70 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
19d80 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
19d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
19da0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
19db0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
19dc0 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19df0 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e10 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
19e20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
19e30 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
19e50 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
19e60 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
19e70 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
19e80 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
19e90 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
19ea0 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
19ed0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
19ee0 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
19ef0 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
19f00 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
19f10 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
19f40 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
19f50 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
19f70 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
19f80 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
19fb0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
19fc0 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
19ff0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
1a000 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1a030 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
1a040 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
1a050 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
1a060 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
1a070 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
1a080 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
1a090 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
1a0a0 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
1a0b0 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
1a0c0 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
1a0d0 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
1a0e0 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
1a0f0 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
1a100 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
1a110 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
1a120 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
1a130 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
1a140 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
1a150 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
1a160 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
1a170 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1a180 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
1a190 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33   file_format, u3
1a1a0 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20  2 *pLen){.  int 
1a1b0 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
1a1c0 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
1a1d0 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30   assert( pLen!=0
1a1e0 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26   );.  if( flags&
1a1f0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1a200 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72  *pLen = 0;.    r
1a210 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a220 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
1a230 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
1a240 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
1a250 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
1a260 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
1a270 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
1a280 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
1a290 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
1a2a0 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
1a2b0 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
1a2c0 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
1a2d0 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
1a2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a2f0 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
1a300 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
1a310 20 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d       if( (i&1)==
1a320 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
1a330 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  >=4 ){.        *
1a340 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  pLen = 0;.      
1a350 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29    return 8+(u32)
1a360 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  u;.      }else{.
1a370 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
1a380 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
1a390 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
1a3a0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
1a3b0 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32  767 ){ *pLen = 2
1a3c0 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20  ; return 2; }.  
1a3d0 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
1a3e0 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72   ){ *pLen = 3; r
1a3f0 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69  eturn 3; }.    i
1a400 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
1a410 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72   ){ *pLen = 4; r
1a420 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69  eturn 4; }.    i
1a430 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
1a440 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65  ){ *pLen = 6; re
1a450 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70  turn 5; }.    *p
1a460 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
1a470 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
1a480 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
1a490 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38  ){.    *pLen = 8
1a4a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  ;.    return 7;.
1a4b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
1a4c0 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
1a4d0 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
1a4e0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1a4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
1a500 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
1a510 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
1a520 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
1a530 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
1a540 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
1a550 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20  ;.  }.  *pLen = 
1a560 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  n;.  return ((n*
1a570 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
1a580 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
1a590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  .}../*.** The si
1a5a0 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74  zes for serial t
1a5b0 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ypes less than 1
1a5c0 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  28.*/.static con
1a5d0 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61  st u8 sqlite3Sma
1a5e0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20  llTypeSizes[] = 
1a5f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20  {.        /*  0 
1a600 20 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20    1   2   3   4 
1a610 20 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20    5   6   7   8 
1a620 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30    9 */   ./*   0
1a630 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c   */   0,  1,  2,
1a640 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c    3,  4,  6,  8,
1a650 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    8,  0,  0,./* 
1a660 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   10 */   0,  0, 
1a670 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
1a680 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a   2,  2,  3,  3,.
1a690 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20  /*  20 */   4,  
1a6a0 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20  4,  5,  5,  6,  
1a6b0 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20  6,  7,  7,  8,  
1a6c0 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39  8,./*  30 */   9
1a6d0 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31  ,  9, 10, 10, 11
1a6e0 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33  , 11, 12, 12, 13
1a6f0 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20  , 13,./*  40 */ 
1a700 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c   14, 14, 15, 15,
1a710 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c   16, 16, 17, 17,
1a720 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20   18, 18,./*  50 
1a730 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20  */  19, 19, 20, 
1a740 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20  20, 21, 21, 22, 
1a750 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20  22, 23, 23,./*  
1a760 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32  60 */  24, 24, 2
1a770 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32  5, 25, 26, 26, 2
1a780 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f  7, 27, 28, 28,./
1a790 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39  *  70 */  29, 29
1a7a0 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31  , 30, 30, 31, 31
1a7b0 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33  , 32, 32, 33, 33
1a7c0 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c  ,./*  80 */  34,
1a7d0 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c   34, 35, 35, 36,
1a7e0 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c   36, 37, 37, 38,
1a7f0 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20   38,./*  90 */  
1a800 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20  39, 39, 40, 40, 
1a810 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20  41, 41, 42, 42, 
1a820 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a  43, 43,./* 100 *
1a830 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34  /  44, 44, 45, 4
1a840 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34  5, 46, 46, 47, 4
1a850 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31  7, 48, 48,./* 11
1a860 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30  0 */  49, 49, 50
1a870 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32  , 50, 51, 51, 52
1a880 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a  , 52, 53, 53,./*
1a890 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c   120 */  54, 54,
1a8a0 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c   55, 55, 56, 56,
1a8b0 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a   57, 57.};../*.*
1a8c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
1a8d0 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
1a8e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1a8f0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
1a900 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
1a910 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
1a920 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
1a930 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
1a940 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1a950 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72  128 ){.    retur
1a960 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
1a970 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
1a980 20 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61     assert( seria
1a990 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20  l_type<12 .     
1a9a0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1a9b0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
1a9c0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73  serial_type]==(s
1a9d0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1a9e0 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  /2 );.    return
1a9f0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1aa00 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1aa10 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71  pe];.  }.}.u8 sq
1aa20 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65  lite3VdbeOneByte
1aa30 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38  SerialTypeLen(u8
1aa40 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
1aa50 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f   assert( serial_
1aa60 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65  type<128 );.  re
1aa70 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
1aa80 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
1aa90 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a  l_type];  .}../*
1aaa0 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
1aab0 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
1aac0 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
1aad0 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
1aae0 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
1aaf0 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
1ab00 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
1ab10 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
1ab20 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
1ab30 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
1ab40 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
1ab50 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
1ab60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1ab70 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
1ab80 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
1ab90 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
1aba0 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
1abb0 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
1abc0 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
1abd0 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
1abe0 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
1abf0 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
1ac00 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
1ac10 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
1ac20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
1ac30 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
1ac40 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
1ac50 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
1ac60 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
1ac70 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
1ac80 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
1ac90 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
1aca0 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
1acb0 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
1acc0 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
1acd0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
1ace0 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
1acf0 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
1ad00 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
1ad10 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
1ad20 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
1ad30 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
1ad40 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
1ad50 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
1ad60 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
1ad70 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
1ad80 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
1ad90 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
1ada0 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
1adb0 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
1adc0 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
1add0 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
1ade0 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
1adf0 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
1ae00 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
1ae10 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
1ae20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
1ae30 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
1ae40 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
1ae50 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
1ae60 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
1ae70 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
1ae80 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
1ae90 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
1aea0 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
1aeb0 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
1aec0 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
1aed0 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
1aee0 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
1aef0 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
1af00 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
1af10 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
1af20 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
1af30 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
1af40 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
1af50 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
1af60 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
1af70 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
1af80 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
1af90 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
1afa0 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
1afb0 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
1afc0 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
1afd0 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
1afe0 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
1aff0 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
1b000 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
1b010 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
1b020 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
1b030 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
1b040 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
1b050 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
1b060 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
1b070 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
1b080 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
1b090 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
1b0a0 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
1b0b0 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
1b0c0 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
1b0d0 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
1b0e0 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
1b0f0 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
1b100 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
1b110 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
1b120 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
1b130 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
1b140 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
1b150 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
1b160 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
1b170 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
1b180 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
1b190 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
1b1a0 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
1b1b0 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
1b1c0 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
1b1d0 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
1b1e0 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
1b1f0 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
1b200 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
1b210 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
1b220 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1b230 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
1b240 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
1b250 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
1b260 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
1b270 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
1b280 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
1b290 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
1b2a0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1b2b0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1b2c0 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
1b2d0 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
1b2e0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1b2f0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1b300 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
1b310 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
1b320 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
1b330 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
1b340 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
1b350 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
1b360 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
1b370 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
1b380 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
1b390 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
1b3a0 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
1b3b0 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
1b3c0 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
1b3d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1b3e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b3f0 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
1b400 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
1b410 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
1b420 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
1b430 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
1b440 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
1b450 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
1b460 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
1b470 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
1b480 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
1b490 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
1b4a0 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
1b4b0 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
1b4c0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
1b4d0 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
1b4e0 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
1b4f0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
1b500 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
1b510 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
1b520 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
1b530 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
1b540 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1b550 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1b560 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
1b570 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
1b580 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
1b590 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
1b5a0 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
1b5b0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
1b5c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b5d0 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
1b5e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
1b5f0 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  = i = sqlite3Sma
1b600 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
1b610 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73  al_type];.    as
1b620 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
1b630 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
1b640 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
1b650 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
1b660 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
1b670 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
1b680 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
1b690 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
1b6a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b6b0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
1b6c0 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
1b6d0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1b6e0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
1b6f0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
1b700 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
1b710 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b720 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1b730 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
1b740 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69  = pMem->n;.    i
1b750 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70  f( len>0 ) memcp
1b760 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
1b770 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
1b780 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
1b790 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
1b7a0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
1b7b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
1b7c0 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
1b7d0 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
1b7e0 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
1b7f0 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
1b800 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1b810 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
1b820 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
1b830 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
1b840 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
1b850 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
1b860 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
1b870 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
1b880 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
1b890 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
1b8a0 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
1b8b0 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
1b8c0 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
1b8d0 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
1b8e0 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
1b8f0 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
1b900 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
1b910 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
1b920 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
1b930 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
1b940 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
1b950 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
1b960 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
1b970 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
1b980 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
1b990 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
1b9a0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
1b9b0 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
1b9c0 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
1b9d0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1b9e0 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
1b9f0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1ba00 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
1ba10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ba20 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1ba30 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
1ba40 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
1ba50 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
1ba60 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
1ba70 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
1ba80 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
1ba90 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
1baa0 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
1bab0 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
1bac0 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
1bad0 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
1bae0 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
1baf0 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
1bb00 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
1bb10 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1bb20 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
1bb30 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1bb40 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
1bb50 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
1bb60 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
1bb70 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb90 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
1bba0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
1bbb0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbd0 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
1bbe0 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
1bbf0 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
1bc00 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bc10 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
1bc20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1bc30 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
1bc40 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
1bc50 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
1bc60 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
1bc70 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32  E-OF: R-29851-52
1bc80 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62  272 Value is a b
1bc90 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74  ig-endian 64-bit
1bca0 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d  .    ** twos-com
1bcb0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1bcc0 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e   */.    pMem->u.
1bcd0 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
1bce0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1bcf0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65   MEM_Int;.    te
1bd00 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1bd10 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i<0 );.  }else{.
1bd20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1bd30 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31  OF: R-57343-4911
1bd40 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1bd50 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34  -endian IEEE 754
1bd60 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20  -2008 64-bit.   
1bd70 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
1bd80 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69  nt number. */.#i
1bd90 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
1bda0 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
1bdb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1bdc0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
1bdd0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
1bde0 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
1bdf0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1be00 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
1be10 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
1be20 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
1be30 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
1be40 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
1be50 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
1be60 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
1be70 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
1be80 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
1be90 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
1bea0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
1beb0 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
1bec0 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
1bed0 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
1bee0 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
1bef0 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
1bf00 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
1bf10 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1bf20 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
1bf30 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
1bf40 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
1bf50 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
1bf60 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
1bf70 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
1bf80 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
1bf90 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
1bfa0 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
1bfb0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
1bfc0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
1bfd0 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
1bfe0 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
1bff0 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
1c000 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
1c010 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
1c020 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
1c030 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
1c040 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
1c050 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
1c060 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1c070 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
1c080 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
1c090 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
1c0a0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
1c0b0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1c0c0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1c0d0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
1c0e0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
1c110 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
1c120 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
1c130 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1c140 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
1c150 20 7b 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20 75   { /* Internal u
1c160 73 65 20 6f 6e 6c 79 3a 20 4e 55 4c 4c 20 77 69  se only: NULL wi
1c170 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
1c180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c190 2a 2a 20 55 50 44 41 54 45 20 6e 6f 2d 63 68 61  ** UPDATE no-cha
1c1a0 6e 67 65 20 66 6c 61 67 20 73 65 74 20 2a 2f 0a  nge flag set */.
1c1b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c1c0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  s = MEM_Null|MEM
1c1d0 5f 5a 65 72 6f 3b 0a 20 20 20 20 20 20 70 4d 65  _Zero;.      pMe
1c1e0 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  m->n = 0;.      
1c1f0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20  pMem->u.nZero = 
1c200 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1c210 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1c220 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
1c230 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1c240 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
1c250 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
1c260 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c270 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
1c280 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
1c290 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1c2a0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1c2b0 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
1c2c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1c2d0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1c2e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
1c2f0 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
1c300 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
1c310 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
1c320 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
1c330 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1c340 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
1c350 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1c360 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c370 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c380 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c390 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1c3a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1c3b0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1c3c0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c3d0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1c3e0 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
1c3f0 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
1c400 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
1c410 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1c420 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1c430 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1c440 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
1c450 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1c460 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1c470 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1c480 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1c490 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1c4a0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
1c4b0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1c4c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c4d0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1c4e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1c4f0 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
1c500 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1c510 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
1c520 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1c530 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1c540 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1c550 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1c560 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1c570 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c580 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c590 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1c5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1c5b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1c5c0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1c5d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c5e0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1c5f0 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1c600 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1c610 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1c620 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1c630 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1c640 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1c650 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1c660 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1c670 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1c680 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1c690 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1c6a0 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1c6b0 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1c6c0 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1c6d0 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1c6e0 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1c6f0 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1c700 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1c710 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1c720 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1c730 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1c740 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1c750 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1c760 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1c770 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c780 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1c790 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1c7a0 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1c7b0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1c7c0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1c7d0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1c7e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1c7f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1c800 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1c810 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1c820 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1c830 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1c840 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c850 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c860 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c870 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1c880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c890 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1c8a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c8b0 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1c8c0 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1c8d0 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1c8e0 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1c8f0 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1c900 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1c910 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1c920 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1c930 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1c940 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1c950 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1c960 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1c970 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1c980 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1c990 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1c9a0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1c9b0 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1c9c0 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1c9d0 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1c9e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c9f0 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1ca00 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1ca10 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1ca20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1ca30 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1ca40 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1ca50 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1ca60 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1ca70 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1ca80 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1ca90 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1caa0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1cab0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1cac0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1cad0 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1cae0 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1caf0 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1cb00 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1cb10 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1cb20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1cb30 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1cb40 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1cb50 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1cb60 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1cb70 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1cb80 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1cb90 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1cba0 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1cbb0 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1cbc0 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1cbd0 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1cbe0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1cbf0 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1cc00 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1cc10 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1cc20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1cc30 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1cc40 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1cc50 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1cc60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1cc70 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1cc80 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1cc90 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1cca0 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1ccb0 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1ccc0 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1ccd0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1cce0 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1ccf0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1cd00 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1cd10 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1cd20 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1cd30 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1cd40 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1cd50 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1cd60 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1cd70 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1cd80 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1cd90 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1cda0 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1cdb0 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1cdc0 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1cdd0 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1cde0 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1cdf0 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1ce00 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1ce10 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1ce20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1ce30 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1ce40 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1ce50 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1ce60 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1ce70 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1ce80 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1ce90 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1cea0 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1ceb0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1cec0 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1ced0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1cee0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1cef0 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1cf00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1cf10 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1cf20 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1cf30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1cf40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1cf50 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fo              
1cf60 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1cf70 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1cf80 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1cf90 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1cfa0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1cfb0 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1cfc0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
1cfd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1cfe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cff0 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1d000 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20  red for *p */.  
1d010 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1d020 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1d030 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1d040 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1d050 6e 4b 65 79 46 69 65 6c 64 2b 31 29 3b 0a 20 20  nKeyField+1);.  
1d060 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1d070 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1d080 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1d090 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1d0a0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1d0b0 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   0;.  p->aMem = 
1d0c0 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1d0d0 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1d0e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1d0f0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1d100 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1d110 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1d120 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1d130 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1d140 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1d150 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
1d160 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
1d170 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
1d180 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
1d190 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
1d1a0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
1d1b0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
1d1c0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
1d1d0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
1d1e0 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
1d1f0 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
1d200 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
1d210 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
1d220 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
1d230 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
1d240 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1d250 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1d260 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
1d270 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
1d280 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
1d290 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d2a0 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
1d2b0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
1d2c0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
1d2d0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
1d2e0 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
1d2f0 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
1d300 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1d310 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
1d320 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1d330 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
1d340 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1d350 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1d360 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
1d370 20 75 33 32 20 64 3b 20 0a 20 20 75 33 32 20 69   u32 d; .  u32 i
1d380 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1d390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1d3a0 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
1d3b0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1d3c0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3e0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1d3f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
1d400 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
1d410 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
1d420 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
1d430 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
1d440 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1d450 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
1d460 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1d470 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1d480 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
1d490 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
1d4a0 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
1d4b0 28 75 33 32 29 6e 4b 65 79 20 29 7b 0a 20 20 20  (u32)nKey ){.   
1d4c0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1d4d0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
1d4e0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
1d4f0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
1d500 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
1d510 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1d520 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
1d530 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1d540 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
1d550 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
1d560 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1d570 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
1d580 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
1d590 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
1d5a0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
1d5b0 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
1d5c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1d5d0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
1d5e0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
1d5f0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
1d600 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
1d610 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
1d620 0a 20 20 69 66 28 20 64 3e 28 75 33 32 29 6e 4b  .  if( d>(u32)nK
1d630 65 79 20 26 26 20 75 20 29 7b 0a 20 20 20 20 61  ey && u ){.    a
1d640 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1d650 42 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 61  B );.    /* In a
1d660 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64 20   corrupt record 
1d670 65 6e 74 72 79 2c 20 74 68 65 20 6c 61 73 74 20  entry, the last 
1d680 70 4d 65 6d 20 6d 69 67 68 74 20 68 61 76 65 20  pMem might have 
1d690 62 65 65 6e 20 73 65 74 20 75 70 20 75 73 69 6e  been set up usin
1d6a0 67 20 0a 20 20 20 20 2a 2a 20 75 6e 69 6e 69 74  g .    ** uninit
1d6b0 69 61 6c 69 7a 65 64 20 6d 65 6d 6f 72 79 2e 20  ialized memory. 
1d6c0 4f 76 65 72 77 72 69 74 65 20 69 74 73 20 76 61  Overwrite its va
1d6d0 6c 75 65 20 77 69 74 68 20 4e 55 4c 4c 2c 20 74  lue with NULL, t
1d6e0 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 2a 2a  o prevent.    **
1d6f0 20 77 61 72 6e 69 6e 67 73 20 66 72 6f 6d 20 4d   warnings from M
1d700 53 41 4e 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  SAN. */.    sqli
1d710 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
1d720 6c 28 70 4d 65 6d 2d 31 29 3b 0a 20 20 7d 0a 20  l(pMem-1);.  }. 
1d730 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
1d740 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20  Info->nKeyField 
1d750 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
1d760 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64 65  ld = u;.}..#ifde
1d770 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1d780 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d790 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
1d7a0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
1d7b0 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
1d7c0 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
1d7d0 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
1d7e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1d7f0 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
1d800 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d810 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
1d820 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1d830 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
1d840 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
1d850 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
1d860 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
1d870 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1d880 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
1d890 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
1d8a0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1d8b0 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
1d8c0 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
1d8d0 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
1d8e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1d8f0 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
1d900 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
1d910 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
1d920 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1d930 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ue if the result
1d940 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
1d950 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1d960 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a  desiredResult..*
1d970 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1d980 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73  f there is a dis
1d990 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  agreement..*/.st
1d9a0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1d9b0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1d9c0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1d9d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1d9e0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1d9f0 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1da00 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1da10 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1da20 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73    int desiredRes
1da30 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
1da40 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65  /* Correct answe
1da50 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  r */.){.  u32 d1
1da60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1da70 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1da80 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1da90 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1daa0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1dab0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1dac0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
1dad0 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
1dae0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1daf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db00 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
1db10 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
1db20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1db30 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1db40 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1db50 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1db60 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
1db70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1db80 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1db90 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
1dba0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1dbb0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1dbc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1dbd0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1dbe0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
1dbf0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1dc00 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
1dc10 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
1dc20 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
1dc30 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
1dc40 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
1dc50 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1dc60 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1dc70 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1dc80 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1dc90 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
1dca0 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
1dcb0 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
1dcc0 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
1dcd0 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
1dce0 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
1dcf0 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
1dd00 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
1dd10 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
1dd20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
1dd30 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
1dd40 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
1dd50 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
1dd60 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
1dd70 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
1dd80 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
1dd90 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
1dda0 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
1ddb0 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
1ddc0 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
1ddd0 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
1dde0 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
1ddf0 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
1de00 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
1de10 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
1de20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
1de30 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
1de40 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
1de50 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1de60 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
1de70 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
1de80 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
1de90 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
1dea0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
1deb0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1dec0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1ded0 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39  ;.  if( szHdr1>9
1dee0 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51  8307 ) return SQ
1def0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1df00 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
1df10 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1df20 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65  >nAllField>=pPKe
1df30 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
1df40 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1df50 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1df60 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1df70 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1df80 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30  nfo->nKeyField>0
1df90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1dfa0 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1dfb0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1dfc0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1dfd0 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
1dfe0 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
1dff0 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
1e000 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
1e010 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
1e020 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
1e030 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
1e040 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
1e050 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1e060 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
1e070 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
1e080 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
1e090 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
1e0a0 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
1e0b0 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
1e0c0 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
1e0d0 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
1e0e0 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
1e0f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e100 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
1e110 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
1e120 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
1e130 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
1e140 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
1e150 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
1e160 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
1e170 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1e180 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
1e190 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
1e1a0 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 28 75 36  /.    if( d1+(u6
1e1b0 34 29 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  4)serial_type1+2
1e1c0 3e 28 75 36 34 29 6e 4b 65 79 31 0a 20 20 20 20  >(u64)nKey1.    
1e1d0 20 26 26 20 64 31 2b 28 75 36 34 29 73 71 6c 69   && d1+(u64)sqli
1e1e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1e1f0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1e200 31 29 3e 28 75 36 34 29 6e 4b 65 79 31 20 0a 20  1)>(u64)nKey1 . 
1e210 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1e220 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e230 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1e240 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1e250 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1e260 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1e270 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1e280 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1e290 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1e2a0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1e2b0 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1e2c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1e2d0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1e2e0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1e2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e300 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65 79              pKey
1e310 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e  Info->nAllField>
1e320 69 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i ? pKeyInfo->aC
1e330 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
1e340 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1e350 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1e360 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1e370 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1e380 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1e390 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1e3a0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1e3b0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1e3c0 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1e3d0 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1e3e0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1e400 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1e410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1e420 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1e430 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1e440 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1e450 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1e460 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1e470 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1e480 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1e490 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1e4a0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1e4b0 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1e4c0 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1e4d0 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1e4e0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1e4f0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1e500 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1e510 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1e520 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1e530 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1e540 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1e550 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1e560 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1e570 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1e580 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1e590 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1e5a0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1e5b0 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1e5c0 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1e5d0 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1e5e0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1e5f0 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1e600 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1e610 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1e620 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1e630 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1e640 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1e650 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1e660 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1e670 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1e680 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1e690 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1e6a0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1e6b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1e6c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1e6d0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1e6e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e6f0 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  BUG./*.** Count 
1e700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
1e710 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c  elds (a.k.a. col
1e720 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63  umns) in the rec
1e730 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20  ord given by.** 
1e740 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20  pKey,nKey.  The 
1e750 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1e760 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74   count is less t
1e770 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1e780 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76  the.** limit giv
1e790 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e  en by pKeyInfo->
1e7a0 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  nAllField..**.**
1e7b0 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1e7c0 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1e7d0 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1e7e0 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1e7f0 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1e800 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1e810 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1e820 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1e830 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1e840 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1e850 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1e860 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1e870 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1e880 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1e890 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f 72  nfo.nKeyField or
1e8a0 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65   KeyInfo.nAllFie
1e8b0 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 63  ld values were c
1e8c0 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72  omputed.** incor
1e8d0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
1e8e0 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 72  c void vdbeAsser
1e8f0 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1e900 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e  nLimits(.  int n
1e910 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Key, const void 
1e920 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
1e930 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79  record to verify
1e940 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79   */ .  const Key
1e950 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20  Info *pKeyInfo  
1e960 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20       /* Compare 
1e970 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b  size with this K
1e980 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69  eyInfo */.){.  i
1e990 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20  nt nField = 0;. 
1e9a0 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33   u32 szHdr;.  u3
1e9b0 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74  2 idx;.  u32 not
1e9c0 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Used;.  const un
1e9d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1e9e0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
1e9f0 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a  ned char*)pKey;.
1ea00 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1ea10 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64  B ) return;.  id
1ea20 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1ea30 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1ea40 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20  assert( nKey>=0 
1ea50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48  );.  assert( szH
1ea60 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b  dr<=(u32)nKey );
1ea70 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1ea80 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b  Hdr ){.    idx +
1ea90 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1eaa0 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29  ey+idx, notUsed)
1eab0 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a  ;.    nField++;.
1eac0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46    }.  assert( nF
1ead0 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f  ield <= pKeyInfo
1eae0 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a 7d  ->nAllField );.}
1eaf0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1eb00 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1eb10 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1eb20 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1eb30 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1eb40 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1eb50 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1eb60 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1eb70 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1eb80 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1eb90 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1eba0 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1ebb0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1ebc0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1ebd0 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1ebe0 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1ebf0 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1ec00 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1ec10 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1ec20 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1ec30 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1ec40 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1ec50 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1ec60 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1ec70 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1ec80 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1ec90 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1eca0 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1ecb0 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1ecc0 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ece0 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1ecf0 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1ed00 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1ed10 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1ed20 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1ed30 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1ed40 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1ed50 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1ed60 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1ed70 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1ed80 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1ed90 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1eda0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1edb0 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1edc0 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1edd0 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1ede0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1edf0 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1ee00 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1ee10 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1ee20 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1ee30 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1ee40 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1ee50 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1ee60 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1ee70 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1ee80 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1ee90 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1eea0 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1eeb0 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1eec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1eed0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1eee0 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1eef0 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1ef00 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1ef10 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1ef20 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1ef30 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1ef40 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1ef50 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1ef60 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1ef70 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1ef80 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  v2==0) ){.      
1ef90 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70 72  if( prcErr ) *pr
1efa0 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1efb0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1efc0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
1efd0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43  e{.      rc = pC
1efe0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1eff0 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76 31  >pUser, c1.n, v1
1f000 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 20  , c2.n, v2);.   
1f010 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1f020 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
1f030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f040 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
1f050 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1f060 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1f070 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69  he input pBlob i
1f080 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1f090 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69  be a Blob that i
1f0a0 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20  s not marked.** 
1f0b0 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20  with MEM_Zero.  
1f0c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
1f0d0 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72  t could be a zer
1f0e0 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69  o-blob..*/.stati
1f0f0 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28  c int isAllZero(
1f100 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
1f110 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nt n){.  int i;.
1f120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
1f130 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
1f140 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
1f150 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1f160 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1f170 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75  two blobs.  Retu
1f180 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1f190 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1f1a0 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  f the first.** i
1f1b0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1f1c0 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1f1d0 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1f1e0 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  d, respectively.
1f1f0 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20  .** If one blob 
1f200 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
1f210 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74  he other, then t
1f220 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68  he shorter is th
1f230 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51 4c  e lessor..*/.SQL
1f240 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1f250 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1f260 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1f270 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1f280 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  B2){.  int c;.  
1f290 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b  int n1 = pB1->n;
1f2a0 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d  .  int n2 = pB2-
1f2b0 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  >n;..  /* It is 
1f2c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65  possible to have
1f2d0 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68   a Blob value th
1f2e0 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d  at has some non-
1f2f0 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  zero content.  *
1f300 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65  * followed by ze
1f310 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ro content.  But
1f320 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73   that only comes
1f330 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f   up for Blobs fo
1f340 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rmed.  ** by the
1f350 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1f360 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20  pcode, and such 
1f370 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20  Blobs never get 
1f380 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
1f390 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1f3a0 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  re(). */.  asser
1f3b0 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26  t( (pB1->flags &
1f3c0 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
1f3d0 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65   n1==0 );.  asse
1f3e0 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20  rt( (pB2->flags 
1f3f0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1f400 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  | n2==0 );..  if
1f410 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42  ( (pB1->flags|pB
1f420 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f  2->flags) & MEM_
1f430 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20  Zero ){.    if( 
1f440 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32  pB1->flags & pB2
1f450 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1f460 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ro ){.      retu
1f470 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20  rn pB1->u.nZero 
1f480 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  - pB2->u.nZero;.
1f490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42      }else if( pB
1f4a0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  1->flags & MEM_Z
1f4b0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ero ){.      if(
1f4c0 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d   !isAllZero(pB2-
1f4d0 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65  >z, pB2->n) ) re
1f4e0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72  turn -1;.      r
1f4f0 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65  eturn pB1->u.nZe
1f500 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c  ro - n2;.    }el
1f510 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69  se{.      if( !i
1f520 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c  sAllZero(pB1->z,
1f530 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72   pB1->n) ) retur
1f540 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1f550 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e  rn n1 - pB2->u.n
1f560 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Zero;.    }.  }.
1f570 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31    c = memcmp(pB1
1f580 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e  ->z, pB2->z, n1>
1f590 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20  n2 ? n2 : n1);. 
1f5a0 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20   if( c ) return 
1f5b0 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d  c;.  return n1 -
1f5c0 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f   n2;.}../*.** Do
1f5d0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
1f5e0 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73  tween a 64-bit s
1f5f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e  igned integer an
1f600 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  d a 64-bit float
1f610 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing-point.** num
1f620 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  ber.  Return neg
1f630 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1f640 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1f650 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c  first (i64) is l
1f660 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75  ess than,.** equ
1f670 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1f680 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1f690 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73  d (double)..*/.s
1f6a0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1f6b0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f6c0 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72  (i64 i, double r
1f6d0 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  ){.  if( sizeof(
1f6e0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1f6f0 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f  >8 ){.    LONGDO
1f700 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c  UBLE_TYPE x = (L
1f710 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69  ONGDOUBLE_TYPE)i
1f720 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20  ;.    if( x<r ) 
1f730 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1f740 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20  f( x>r ) return 
1f750 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1f760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1f770 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  64 y;.    double
1f780 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39   s;.    if( r<-9
1f790 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1f7a0 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31  08.0 ) return +1
1f7b0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39 32 32  ;.    if( r>=922
1f7c0 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1f7d0 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1f7e0 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1f7f0 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1f800 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1f810 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20 2b 31   i>y ) return +1
1f820 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c  ;.    s = (doubl
1f830 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72  e)i;.    if( s<r
1f840 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1f850 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75    if( s>r ) retu
1f860 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  rn +1;.    retur
1f870 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
1f880 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
1f890 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
1f8a0 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
1f8b0 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
1f8c0 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
1f8d0 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
1f8e0 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
1f8f0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1f900 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
1f910 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
1f920 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
1f930 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
1f940 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
1f950 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
1f960 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
1f970 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
1f980 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
1f990 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
1f9a0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
1f9b0 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
1f9c0 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
1f9d0 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
1f9e0 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
1f9f0 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1fa00 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
1fa10 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1fa20 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
1fa30 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1fa40 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
1fa50 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
1fa60 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
1fa70 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69   int f1, f2;.  i
1fa80 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  nt combined_flag
1fa90 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31  s;..  f1 = pMem1
1faa0 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20  ->flags;.  f2 = 
1fab0 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem2->flags;.  
1fac0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d  combined_flags =
1fad0 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74   f1|f2;.  assert
1fae0 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ( !sqlite3VdbeMe
1faf0 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 31 29  mIsRowSet(pMem1)
1fb00 20 26 26 20 21 73 71 6c 69 74 65 33 56 64 62 65   && !sqlite3Vdbe
1fb10 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d  MemIsRowSet(pMem
1fb20 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20  2) );. .  /* If 
1fb30 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  one value is NUL
1fb40 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  L, it is less th
1fb50 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66  an the other. If
1fb60 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a   both values.  *
1fb70 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75  * are NULL, retu
1fb80 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
1fb90 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1fba0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1fbb0 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e  return (f2&MEM_N
1fbc0 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e  ull) - (f1&MEM_N
1fbd0 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
1fbe0 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  At least one of 
1fbf0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69  the two values i
1fc00 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a  s a number.  */.
1fc10 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1fc20 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  lags&(MEM_Int|ME
1fc30 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69  M_Real) ){.    i
1fc40 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1fc50 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1fc60 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1fc70 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
1fc80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1fc90 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1fca0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
1fcb0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1fcc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1fcd0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1fce0 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  2 & MEM_Real)!=0
1fcf0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1fd00 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32  em1->u.r < pMem2
1fd10 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d  ->u.r ) return -
1fd20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1fd30 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d  m1->u.r > pMem2-
1fd40 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.r ) return +1
1fd50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1fd60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fd70 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
1fd80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1fd90 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1fda0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fdb0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1fdc0 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e  ompare(pMem1->u.
1fdd0 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a  i, pMem2->u.r);.
1fde0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fdf0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1fe00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fe10 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65    if( (f1&MEM_Re
1fe20 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1fe30 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
1fe40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1fe50 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e  eturn -sqlite3In
1fe60 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1fe70 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d  em2->u.i, pMem1-
1fe80 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1fe90 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1fea0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1feb0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1fec0 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  +1;.  }..  /* If
1fed0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
1fee0 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f  string and the o
1fef0 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20  ther is a blob, 
1ff00 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65  the string is le
1ff10 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
1ff20 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f   are strings, co
1ff30 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  mpare using the 
1ff40 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
1ff50 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
1ff60 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1ff70 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66  EM_Str ){.    if
1ff80 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f1 & MEM_Str)
1ff90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1ffa0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1ffb0 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53   if( (f2 & MEM_S
1ffc0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1ffd0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1ffe0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ..    assert( pM
1fff0 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d  em1->enc==pMem2-
20000 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64  >enc || pMem1->d
20010 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20030 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
20040 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
20050 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
20060 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
20070 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
20080 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
20090 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
200a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
200b0 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
200c0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
200d0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
200e0 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
200f0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20100 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
20110 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
20120 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
20130 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
20140 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
20150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
20160 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
20170 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
20180 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
20190 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
201a0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
201b0 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
201c0 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  pColl, 0);.    }
201d0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
201e0 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
201f0 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
20200 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
20210 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
20220 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
20230 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
20240 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
20250 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
20260 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
20270 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
20280 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65  mcmp().  */.  re
20290 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62  turn sqlite3Blob
202a0 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70  Compare(pMem1, p
202b0 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Mem2);.}.../*.**
202c0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
202d0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
202e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
202f0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61   serial-type tha
20300 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  t.** corresponds
20310 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   to an integer -
20320 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77   all values betw
20330 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c  een 1 and 9 incl
20340 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74  usive .** except
20350 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70   7. The second p
20360 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
20370 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
20380 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a  integer value.**
20390 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f   serialized acco
203a0 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f  rding to serial_
203b0 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74  type. This funct
203c0 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
203d0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20  .** and returns 
203e0 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  the value..*/.st
203f0 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63  atic i64 vdbeRec
20400 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32  ordDecodeInt(u32
20410 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f   serial_type, co
20420 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
20430 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74   u32 y;.  assert
20440 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
20450 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20  (serial_type>=1 
20460 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  && serial_type<=
20470 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  9 && serial_type
20480 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68  !=7) );.  switch
20490 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
204a0 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20  .    case 0:.   
204b0 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74   case 1:.      t
204c0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
204d0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
204e0 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49  eturn ONE_BYTE_I
204f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
20500 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74  se 2:.      test
20510 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
20520 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
20530 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  rn TWO_BYTE_INT(
20540 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
20550 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  3:.      testcas
20560 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
20570 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20580 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
20590 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34  Key);.    case 4
205a0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
205b0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
205c0 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   );.      y = FO
205d0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
205e0 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  y);.      return
205f0 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
20600 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20610 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  5: {.      testc
20620 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
20630 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
20640 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  n FOUR_BYTE_UINT
20650 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
20660 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
20670 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20680 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
20690 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  {.      u64 x = 
206a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
206b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
206c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
206d0 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  80 );.      x = 
206e0 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
206f0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
20700 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
20710 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i64)*(i64*)&x;. 
20720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
20730 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  rn (serial_type 
20740 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  - 8);.}../*.** T
20750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
20760 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
20770 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
20780 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
20790 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
207a0 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
207b0 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
207c0 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
207d0 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
207e0 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
207f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
20800 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
20810 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
20820 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
20830 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
20840 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
20850 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
20860 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
20870 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
20880 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
20890 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
208a0 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
208b0 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
208c0 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
208d0 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
208e0 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73  rgument bSkip is
208f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73   non-zero, it is
20900 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
20910 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
20920 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  eady.** determin
20930 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
20940 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
20950 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a  keys are equal..
20960 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b  **.** Key1 and K
20970 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  ey2 do not have 
20980 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  to contain the s
20990 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ame number of fi
209a0 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a  elds. If all .**
209b0 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70   fields that app
209c0 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73  ear in both keys
209d0 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e   are equal, then
209e0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
209f0 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  _rc is .** retur
20a00 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  ned..**.** If da
20a10 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
20a20 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c  n is discovered,
20a30 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72   set pPKey2->err
20a40 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49  Code to .** SQLI
20a50 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72  TE_CORRUPT and r
20a60 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f  eturn 0. If an O
20a70 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
20a80 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b  untered, .** pPK
20a90 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20  ey2->errCode is 
20aa0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
20ab0 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69  MEM and, if it i
20ac0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a  s not NULL, the.
20ad0 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  ** malloc-failed
20ae0 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74   flag set on dat
20af0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50  abase handle (pP
20b00 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20b10 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  db)..*/.int sqli
20b20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20b30 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20  pareWithSkip(.  
20b40 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
20b50 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
20b60 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
20b70 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
20b80 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
20b90 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20ba0 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
20bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bc0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
20bd0 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
20be0 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
20bf0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
20c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20c10 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
20c20 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
20c30 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
20c40 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
20c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20c60 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
20c70 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
20c80 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
20cb0 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
20cc0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
20cd0 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
20ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
20cf0 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
20d00 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
20d10 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
20d40 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
20d50 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
20d60 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
20d70 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
20d80 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
20d90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
20da0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
20db0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
20dc0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
20dd0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
20de0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
20df0 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
20e00 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
20e10 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
20e20 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
20e30 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
20e40 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
20e50 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
20e60 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
20e70 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
20e80 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
20e90 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
20ea0 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
20eb0 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
20ec0 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
20ed0 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
20ee0 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
20ef0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20f00 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
20f10 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
20f20 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
20f30 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
20f40 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
20f50 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
20f60 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
20f70 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
20f80 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
20f90 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
20fa0 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 20 3d   szHdr1;.    i =
20fb0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 31   0;.  }.  if( d1
20fc0 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
20fd0 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79 32 2d   ){ .    pPKey2-
20fe0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
20ff0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21000 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
21010 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
21020 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   */.  }..  VVA_O
21030 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
21040 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
21050 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
21060 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
21070 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
21080 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
21090 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  AllField>=pPKey2
210a0 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
210b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
210c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
210d0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
210e0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
210f0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
21100 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  >pKeyInfo->nKeyF
21110 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
21120 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
21130 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
21140 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
21150 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
21160 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
21170 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
21180 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
21190 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
211a0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
211b0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
211c0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
211d0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
211e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
211f0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
21200 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
21210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
21220 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
21230 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
21240 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21250 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
21260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21270 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
21280 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
21290 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
212a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71          rc = -sq
212b0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
212c0 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20  pare(pRhs->u.i, 
212d0 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20  mem1.u.r);.     
212e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
212f0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
21300 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
21310 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
21320 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
21330 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
21340 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
21350 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
21360 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
21370 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
21380 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
21390 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
213a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
213b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
213c0 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
213d0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
213e0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
213f0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
21400 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
21410 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
21420 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
21430 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
21440 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
21450 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
21460 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
21470 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
21480 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
21490 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
214a0 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
214b0 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
214c0 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
214d0 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
214e0 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
214f0 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
21500 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
21510 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
21520 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
21530 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
21540 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
21550 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
21560 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
21570 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
215a0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
215b0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
215c0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
215d0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
215e0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
215f0 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
21600 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  <pRhs->u.r ){.  
21610 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
21620 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
21630 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
21640 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
21650 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
21660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21680 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21690 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
216a0 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68  re(mem1.u.i, pRh
216b0 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20  s->u.r);.       
216c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
216d0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
216e0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
216f0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
21700 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
21710 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
21720 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
21730 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
21740 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21750 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
21760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
21770 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
21780 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
21790 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
217a0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
217b0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
217c0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
217d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
217e0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
217f0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
21800 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
21810 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
21820 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
21830 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
21840 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
21850 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
21860 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
21870 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
21880 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 0a  (unsigned)nKey1.
21890 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4b 65           || (pKe
218a0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
218b0 70 4b 65 79 49 6e 66 6f 29 2d 3e 6e 41 6c 6c 46  pKeyInfo)->nAllF
218c0 69 65 6c 64 3c 3d 69 0a 20 20 20 20 20 20 20 20  ield<=i.        
218d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
218e0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
218f0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
21900 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
21910 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
21920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
21930 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
21940 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
21950 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
21960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
21970 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
21980 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
21990 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
219a0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
219b0 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
219c0 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
219d0 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
219e0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
219f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
21a00 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
21a10 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
21a20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
21a30 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
21a40 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
21a50 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
21a60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21a70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
21a80 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
21a90 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
21aa0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
21ab0 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
21ac0 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
21ad0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21ae0 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
21af0 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
21b00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21b10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
21b20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
21b30 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
21b40 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21b50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21b60 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  ( (pRhs->flags &
21b70 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
21b80 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20   pRhs->n==0 );. 
21b90 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
21ba0 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
21bb0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
21bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
21bd0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
21be0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
21bf0 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72  _type<12 || (ser
21c00 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
21c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21c20 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
21c30 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
21c40 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
21c50 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
21c60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21c70 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67  d1+nStr)==(unsig
21c80 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
21c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
21ca0 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73  d1+nStr+1)==(uns
21cb0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
21cc0 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e         if( (d1+n
21cd0 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  Str) > (unsigned
21ce0 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
21cf0 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
21d00 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
21d10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21d20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21d30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21d40 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
21d50 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
21d60 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
21d70 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
21d80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73           if( !is
21d90 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63  AllZero((const c
21da0 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c  har*)&aKey1[d1],
21db0 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20  nStr) ){.       
21dc0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
21dd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21de0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
21df0 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a  Str - pRhs->u.nZ
21e00 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ero;.          }
21e10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21e20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
21e30 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70  mp = MIN(nStr, p
21e40 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
21e50 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
21e60 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
21e70 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
21e80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
21e90 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
21ea0 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s->n;.        }.
21eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21ec0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c     /* RHS is nul
21ed0 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20  l */.    else{. 
21ee0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
21ef0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
21f00 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69        rc = (seri
21f10 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20  al_type!=0);.   
21f20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
21f30 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
21f40 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
21f50 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
21f60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
21f70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21f80 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
21f90 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
21fa0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
21fb0 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
21fc0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
21fd0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
21fe0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
21ff0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
22000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22010 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66  .    i++;.    if
22020 28 20 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  ( i==pPKey2->nFi
22030 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  eld ) break;.   
22040 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
22050 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
22060 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
22070 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
22080 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
22090 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
220a0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
220b0 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
220c0 48 64 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73  Hdr1 && d1<=(uns
220d0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
220e0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
220f0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
22100 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
22110 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
22120 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
22130 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
22140 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
22150 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
22160 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
22170 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
22180 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
22190 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
221a0 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
221b0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
221c0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
221d0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
221e0 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
221f0 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
22200 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
22210 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
22220 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
22230 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
22240 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
22250 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
22260 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
22270 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
22280 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
22290 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
222a0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
222b0 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
222c0 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
222d0 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70      || pPKey2->p
222e0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
222f0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
22300 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
22310 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 1;.  return pP
22320 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
22330 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
22340 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22350 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
22360 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
22370 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
22380 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
22390 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
223a0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
223b0 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
223c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
223d0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
223e0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
223f0 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
22400 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22410 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
22420 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
22430 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22440 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
22450 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
22460 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
22470 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
22480 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
22490 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
224a0 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
224b0 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
224c0 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
224d0 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
224e0 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
224f0 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
22500 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
22510 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
22520 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
22530 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
22540 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
22550 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
22560 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
22570 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
22580 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
22590 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
225a0 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
225b0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
225c0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
225d0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
225e0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
225f0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
22600 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
22610 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
22620 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
22630 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
22640 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
22650 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
22660 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
22670 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
22680 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
22690 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a  u64 x;.  i64 v;.
226a0 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64    i64 lhs;..  vd
226b0 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
226c0 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
226d0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
226e0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
226f0 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a    assert( (*(u8*
22700 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c  )pKey1)<=0x3F ||
22710 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
22720 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
22730 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
22740 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
22750 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
22760 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e  /.      lhs = ON
22770 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
22780 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22790 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
227a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
227b0 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
227c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
227d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
227e0 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  s = TWO_BYTE_INT
227f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
22800 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
22810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22820 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
22830 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
22840 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
22850 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f      lhs = THREE_
22860 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
22870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22880 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
22890 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
228a0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
228b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
228c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
228d0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
228e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  Key);.      lhs 
228f0 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  = (i64)*(int*)&y
22900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22910 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
22920 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22930 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
22940 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
22950 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
22960 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  s = FOUR_BYTE_UI
22970 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
22980 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
22990 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
229a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
229b0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
229c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
229d0 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62  case 6: { /* 8-b
229e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
229f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20  er */.      x = 
22a00 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
22a10 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  Key);.      x = 
22a20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
22a30 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
22a40 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28  ;.      lhs = *(
22a50 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74  i64*)&x;.      t
22a60 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
22a70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22a80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
22a90 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b   .      lhs = 0;
22aa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22ab0 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20    case 9:.      
22ac0 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  lhs = 1;.      b
22ad0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  reak;..    /* Th
22ae0 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65  is case could be
22af0 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74   removed without
22b00 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65   changing the re
22b10 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67  sults of running
22b20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  .    ** this cod
22b30 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20  e. Including it 
22b40 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65  causes gcc to ge
22b50 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20  nerate a faster 
22b60 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73  switch .    ** s
22b70 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20  tatement (since 
22b80 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69  the range of swi
22b90 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20  tch targets now 
22ba0 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61  starts at zero a
22bb0 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e  nd.    ** is con
22bc0 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65  tiguous) but doe
22bd0 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
22be0 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74  duplicate code t
22bf0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
22c00 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73     ** (as gcc is
22c10 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74   clever enough t
22c20 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77  o combine the tw
22c30 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f  o like cases). O
22c40 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  ther .    ** com
22c50 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20  pilers might be 
22c60 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20  similar.  */ .  
22c70 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37    case 0: case 7
22c80 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
22c90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
22ca0 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
22cb0 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a  Key1, pPKey2);..
22cc0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
22cd0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
22ce0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22cf0 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
22d00 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20   pPKey2);.  }.. 
22d10 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65   v = pPKey2->aMe
22d20 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20  m[0].u.i;.  if( 
22d30 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v>lhs ){.    res
22d40 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
22d50 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73   }else if( v<lhs
22d60 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
22d70 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73  Key2->r2;.  }els
22d80 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46  e if( pPKey2->nF
22d90 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ield>1 ){.    /*
22da0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
22db0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
22dc0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d  s are equal. Com
22dd0 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e  pare the trailin
22de0 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  g .    ** fields
22df0 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  .  */.    res = 
22e00 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22e10 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
22e20 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
22e30 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
22e40 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
22e50 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
22e60 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
22e70 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
22e80 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
22e90 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
22ea0 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
22eb0 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
22ec0 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
22ed0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
22ee0 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65  ult_rc;.    pPKe
22ef0 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
22f00 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
22f10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22f20 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
22f30 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
22f40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
22f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22f60 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
22f70 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
22f80 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
22f90 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
22fa0 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
22fb0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
22fc0 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
22fd0 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
22fe0 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
22ff0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
23000 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
23010 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
23020 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
23030 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
23040 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
23050 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
23060 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
23070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23080 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
23090 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
230a0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
230b0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
230c0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
230d0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
230e0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
230f0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
23100 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28  st u8 *aKey1 = (
23110 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b  const u8*)pKey1;
23120 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
23130 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pe;.  int res;..
23140 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
23150 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20  ->aMem[0].flags 
23160 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76  & MEM_Str );.  v
23170 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
23180 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
23190 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
231a0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  Key2->pKeyInfo);
231b0 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  .  getVarint32(&
231c0 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c  aKey1[1], serial
231d0 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65  _type);.  if( se
231e0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
231f0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23200 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r1;      /* (p
23210 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
23220 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c   number or a nul
23230 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  l */.  }else if(
23240 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
23250 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72   0x01) ){ .    r
23260 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
23270 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
23280 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62  nKey1) is a blob
23290 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
232a0 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69   int nCmp;.    i
232b0 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74  nt nStr;.    int
232c0 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30   szHdr = aKey1[0
232d0 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28  ];..    nStr = (
232e0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20  serial_type-12) 
232f0 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a  / 2;.    if( (sz
23300 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b  Hdr + nStr) > nK
23310 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b  ey1 ){.      pPK
23320 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
23330 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
23340 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
23350 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f  turn 0;    /* Co
23360 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
23370 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  }.    nCmp = MIN
23380 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
23390 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20  ].n, nStr );.   
233a0 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61   res = memcmp(&a
233b0 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b  Key1[szHdr], pPK
233c0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20  ey2->aMem[0].z, 
233d0 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  nCmp);..    if( 
233e0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
233f0 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b  res = nStr - pPK
23400 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a  ey2->aMem[0].n;.
23410 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
23420 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
23430 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
23440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
23450 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
23460 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
23470 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
23480 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
23490 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
234a0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
234b0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
234c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  ;.          pPKe
234d0 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
234e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
234f0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
23500 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
23510 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
23520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23530 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
23540 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
23550 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
23560 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
23570 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
23580 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
23590 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
235a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
235b0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
235c0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
235d0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
235e0 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
235f0 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
23600 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
23610 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
23620 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
23630 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
23640 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
23650 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
23660 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23670 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
23680 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
23690 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
236a0 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
236b0 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
236c0 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
236d0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
236e0 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
236f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
23700 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
23710 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
23720 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
23730 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
23740 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
23750 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
23760 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
23770 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
23780 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
23790 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
237a0 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
237b0 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
237c0 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
237d0 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
237e0 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
237f0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
23800 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
23810 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
23820 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
23830 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
23840 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
23850 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
23860 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
23870 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
23880 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
23890 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
238a0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
238b0 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
238c0 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
238d0 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
238e0 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
238f0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
23900 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
23910 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
23920 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
23930 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
23940 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
23950 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
23960 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
23970 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
23980 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
23990 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
239a0 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
239b0 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
239c0 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
239d0 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
239e0 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
239f0 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
23a00 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
23a10 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
23a20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
23a30 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
23a40 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
23a50 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
23a60 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66    if( p->pKeyInf
23a70 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33  o->nAllField<=13
23a80 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
23a90 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
23aa0 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
23ab0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
23ac0 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
23ad0 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
23ae0 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
23af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23b00 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
23b10 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
23b20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
23b30 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
23b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
23b50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
23b60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
23b70 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
23b80 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
23b90 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
23ba0 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
23bb0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
23bc0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
23bd0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
23be0 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
23bf0 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
23c00 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
23c10 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
23c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
23c30 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
23c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
23c50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
23c60 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
23c70 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
23c80 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23c90 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
23ca0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
23cb0 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
23cc0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
23cd0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
23ce0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
23cf0 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
23d00 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
23d10 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
23d20 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
23d30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23d40 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
23d50 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
23d60 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
23d70 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
23d80 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
23d90 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
23da0 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
23db0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
23dc0 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
23dd0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
23de0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
23df0 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
23e00 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
23e10 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
23e20 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
23e30 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
23e40 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
23e50 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
23e60 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
23e70 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
23e80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
23e90 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
23ea0 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
23eb0 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
23ec0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
23ed0 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
23ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
23ef0 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
23f00 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
23f10 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
23f20 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
23f30 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
23f40 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
23f50 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
23f60 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
23f70 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
23f80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
23f90 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
23fa0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
23fb0 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
23fc0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
23fd0 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
23fe0 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
23ff0 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
24000 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
24010 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
24020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
24030 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
24040 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65  d(pCur) );.  nCe
24050 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  llKey = sqlite3B
24060 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
24070 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28  pCur);.  assert(
24080 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
24090 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
240a0 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
240b0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
240c0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
240d0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
240e0 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
240f0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
24100 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
24110 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
24120 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
24130 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
24140 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
24150 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24160 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
24170 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
24180 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
24190 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
241a0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
241b0 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
241c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
241d0 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
241e0 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
241f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
24200 7a 48 64 72 3e 30 78 37 66 66 66 66 66 66 66 20  zHdr>0x7fffffff 
24210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e  );.  assert( m.n
24220 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  >=0 );.  if( unl
24230 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
24240 20 73 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64   szHdr>(unsigned
24250 29 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  )m.n) ){.    got
24260 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
24270 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
24280 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
24290 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
242a0 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
242b0 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
242c0 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
242d0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
242e0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
242f0 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
24300 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
24310 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
24320 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
24330 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
24340 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
24350 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
24360 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
24370 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
24380 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
24390 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
243a0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
243b0 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
243c0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
243d0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
243e0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
243f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
24400 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
24410 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
24420 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
24430 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
24440 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
24450 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
24460 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
24470 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
24480 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
24490 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74  [typeRowid];.  t
244a0 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e  estcase( (u32)m.
244b0 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  n==szHdr+lenRowi
244c0 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  d );.  if( unlik
244d0 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48  ely((u32)m.n<szH
244e0 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a  dr+lenRowid) ){.
244f0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
24500 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
24510 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
24520 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
24530 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
24540 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
24550 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
24560 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
24570 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
24580 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
24590 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
245a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
245b0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
245c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
245d0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
245e0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
245f0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
24600 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
24610 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
24620 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
24630 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
24640 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24650 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
24660 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
24670 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c  stcase( m.szMall
24680 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
24690 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
246a0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
246b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
246c0 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
246d0 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
246e0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
246f0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
24700 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67  s pointing to ag
24710 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
24720 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61   string in pUnpa
24730 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74  cked.  Write int
24740 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
24750 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
24760 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
24770 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
24780 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
24790 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
247a0 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b  ter than pUnpack
247b0 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ed.  Return SQLI
247c0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
247d0 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65  ..**.** pUnpacke
247e0 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  d is either crea
247f0 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
24800 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
24810 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
24820 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
24830 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
24840 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
24850 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
24860 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
24870 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
24880 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
24890 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
248a0 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
248b0 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
248c0 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
248d0 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
248e0 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69  entire key..*/.i
248f0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
24900 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73  xKeyCompare(.  s
24910 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
24940 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  ection */.  Vdbe
24950 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24970 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
24980 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
24990 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
249a0 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20  d *pUnpacked,   
249b0 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
249c0 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a  version of key *
249d0 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
24a00 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
24a10 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
24a20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
24a30 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
24a40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
24a50 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
24a60 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
24a70 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
24a80 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75  ;.  pCur = pC->u
24a90 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73  c.pCursor;.  ass
24aa0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24ab0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
24ac0 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b  Cur) );.  nCellK
24ad0 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
24ae0 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
24af0 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65  r);.  /* nCellKe
24b00 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
24b10 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
24b20 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
24b30 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
24b40 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
24b50 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
24b60 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
24b70 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
24b80 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
24b90 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
24ba0 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
24bb0 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
24bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24bd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24be0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
24bf0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
24c00 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
24c10 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
24c20 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
24c30 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29  32)nCellKey, &m)
24c40 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
24c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24c60 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
24c70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24c80 72 65 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20  reWithSkip(m.n, 
24c90 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20  m.z, pUnpacked, 
24ca0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
24cb0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
24cc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24cd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
24ce0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
24cf0 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
24d00 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
24d10 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
24d20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
24d30 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
24d40 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
24d50 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
24d60 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
24d70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
24d80 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
24d90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24da0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
24db0 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
24dc0 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
24dd0 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
24de0 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
24df0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
24e00 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
24e10 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
24e20 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
24e30 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
24e40 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
24e50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
24e60 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
24e70 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
24e80 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
24e90 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
24ea0 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
24eb0 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
24ec0 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
24ed0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
24ee0 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
24ef0 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
24f00 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
24f10 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
24f20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
24f30 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
24f40 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
24f50 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
24f60 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
24f70 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
24f80 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
24f90 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
24fa0 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
24fb0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
24fc0 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
24fd0 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
24fe0 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
24ff0 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
25000 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
25010 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
25020 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
25030 0a 2a 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20  .**.** If iCode 
25040 69 73 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72  is 1, then expir
25050 61 74 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72  ation is advisor
25060 79 2e 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  y.  The statemen
25070 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  t should.** be r
25080 65 70 72 65 70 61 72 65 64 20 62 65 66 6f 72 65  eprepared before
25090 20 62 65 69 6e 67 20 72 65 73 74 61 72 74 65 64   being restarted
250a0 2c 20 62 75 74 20 69 66 20 69 74 20 69 73 20 61  , but if it is a
250b0 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a  lready running.*
250c0 2a 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20  * it is allowed 
250d0 74 6f 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  to run to comple
250e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  tion..**.** Inte
250f0 72 6e 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rnally, this fun
25100 63 74 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20  ction just sets 
25110 74 68 65 20 56 64 62 65 2e 65 78 70 69 72 65 64  the Vdbe.expired
25120 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20   flag on all.** 
25130 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
25140 6e 74 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69  nts.  The flag i
25150 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61  s set to 1 for a
25160 6e 20 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69  n immediate expi
25170 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65  ration.** and se
25180 74 20 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64  t to 2 for an ad
25190 76 69 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f  visory expiratio
251a0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
251b0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
251c0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
251d0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64  e3 *db, int iCod
251e0 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  e){.  Vdbe *p;. 
251f0 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
25200 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
25210 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
25220 65 64 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20  ed = iCode+1;.  
25230 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
25240 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
25250 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
25260 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
25270 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
25280 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
25290 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
252a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
252b0 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20   SQLITE_PREPARE 
252c0 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62 65  flags for a Vdbe
252d0 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56  ..*/.u8 sqlite3V
252e0 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73 28  dbePrepareFlags(
252f0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
25300 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b  rn v->prepFlags;
25310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25320 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
25330 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
25340 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
25350 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
25360 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
25370 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
25380 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
25390 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
253a0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
253b0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
253c0 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
253d0 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
253e0 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
253f0 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
25400 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
25410 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
25420 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
25430 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
25440 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
25450 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
25460 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
25470 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
25480 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
25490 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
254a0 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
254b0 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
254c0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
254d0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
254e0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
254f0 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
25500 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e      assert( (v->
25510 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
25520 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d  TE_EnableQPSG)==
25530 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
25540 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
25550 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
25560 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
25570 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
25580 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
25590 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
255a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
255b0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
255c0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
255d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
255e0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
255f0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
25600 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
25610 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
25620 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
25630 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
25640 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
25650 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
25660 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
25670 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
25680 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
25690 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
256a0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
256b0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
256c0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
256d0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
256e0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
256f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
25700 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
25710 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
25720 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
25730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d  );.  assert( (v-
25740 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
25750 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
25760 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  =0 );.  if( iVar
25770 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  >=32 ){.    v->e
25780 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30  xpmask |= 0x8000
25790 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  0000;.  }else{. 
257a0 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
257b0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
257c0 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  r-1));.  }.}../*
257d0 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63  .** Cause a func
257e0 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e  tion to throw an
257f0 20 65 72 72 6f 72 20 69 66 20 69 74 20 77 61 73   error if it was
25800 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75   call from OP_Pu
25810 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72  reFunc.** rather
25820 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f   than OP_Functio
25830 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65  n..**.** OP_Pure
25840 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20  Func means that 
25850 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  the function mus
25860 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74  t be determinist
25870 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ic, and should.*
25880 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * throw an error
25890 20 69 66 20 69 74 20 69 73 20 67 69 76 65 6e 20   if it is given 
258a0 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c  inputs that woul
258b0 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65  d make it non-de
258c0 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20  terministic..** 
258d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
258e0 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f  invoked by date/
258f0 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  time functions t
25900 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65  hat use non-dete
25910 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61  rministic.** fea
25920 74 75 72 65 73 20 73 75 63 68 20 61 73 20 27 6e  tures such as 'n
25930 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ow'..*/.int sqli
25940 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73  te3NotPureFunc(s
25950 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
25960 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51  pCtx){.#ifdef SQ
25970 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
25980 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28  3_OR_STAT4.  if(
25990 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20   pCtx->pVdbe==0 
259a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
259b0 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70  if.  if( pCtx->p
259c0 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e  Vdbe->aOp[pCtx->
259d0 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  iOp].opcode==OP_
259e0 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20  PureFunc ){.    
259f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
25a00 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
25a10 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e     "non-determin
25a20 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69  istic function i
25a30 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  n index expressi
25a40 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73  on or CHECK cons
25a50 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20  traint",.       
25a60 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
25a70 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
25a80 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  1;.}..#ifndef SQ
25a90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
25aa0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
25ab0 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
25ac0 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
25ad0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
25ae0 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
25af0 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
25b00 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
25b10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
25b20 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
25b30 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
25b40 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
25b50 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
25b60 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
25b70 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
25b80 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
25b90 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
25ba0 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
25bb0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
25bc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
25bd0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
25be0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25bf0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
25c00 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
25c10 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
25c20 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
25c30 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
25c40 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
25c50 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
25c60 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
25c70 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
25c80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
25c90 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
25ca0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25cb0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
25cc0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  ./*.** If the se
25cd0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
25ce0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61   not NULL, relea
25cf0 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f  se any allocatio
25d00 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ns associated .*
25d10 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72  * with the memor
25d20 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  y cells in the p
25d30 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20  ->aMem[] array. 
25d40 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e  Also free the Un
25d50 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
25d60 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
25d70 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  , using sqlite3D
25d80 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  bFree()..**.** T
25d90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25da0 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70  used to free Unp
25db0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
25dc0 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
25dd0 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55   by.** the vdbeU
25de0 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
25df0 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20  nction found in 
25e00 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74  vdbeapi.c..*/.st
25e10 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
25e20 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74  eeUnpacked(sqlit
25e30 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65  e3 *db, int nFie
25e40 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ld, UnpackedReco
25e50 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
25e60 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
25e70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69    for(i=0; i<nFi
25e80 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
25e90 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
25ea0 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
25eb0 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
25ec0 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
25ed0 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
25ee0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25ef0 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
25f00 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
25f10 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
25f20 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
25f30 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
25f40 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
25f50 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e  TE_HOOK./*.** In
25f60 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
25f70 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
25f80 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
25f90 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
25fa0 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
25fb0 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
25fc0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
25fd0 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
25fe0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
25ff0 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
26000 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
26010 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
26020 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
26030 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
26040 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
26050 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
26060 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
26070 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
26080 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
26090 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
260a0 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
260b0 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
260d0 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
260e0 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
260f0 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
26100 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
26110 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
26120 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
26130 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
26140 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
26170 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
26180 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
26190 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
261a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
261b0 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
261c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261e0 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
261f0 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26210 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
26220 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
26230 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
26260 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
26270 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
26280 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
26290 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
262a0 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
262b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
262c0 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
262d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
262e0 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
262f0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
26300 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
26310 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
26320 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
26330 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
26340 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
26350 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pTab)==0 ){.    
26360 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20  iKey1 = iKey2 = 
26370 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74 65  0;.    preupdate
26380 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  .pPk = sqlite3Pr
26390 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
263a0 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
263b0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
263c0 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
263d0 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d   iKey2 = v->aMem
263e0 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20  [iReg].u.i;.    
263f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65  }else{.      iKe
26400 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20  y2 = iKey1;.    
26410 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
26420 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
26430 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
26440 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
26450 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
26460 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
26470 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
26480 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
26490 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
264a0 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
264b0 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
264c0 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
264d0 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
264e0 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
264f0 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
26500 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
26510 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
26520 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
26530 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
26540 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  eld = pTab->nCol
26550 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
26560 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72  yinfo.aSortOrder
26570 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72   = (u8*)&fakeSor
26580 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64  tOrder;.  preupd
26590 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79  ate.iKey1 = iKey
265a0 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  1;.  preupdate.i
265b0 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20  Key2 = iKey2;.  
265c0 70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d  preupdate.pTab =
265d0 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50   pTab;..  db->pP
265e0 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
265f0 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
26600 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
26610 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
26620 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
26630 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
26640 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
26650 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
26660 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26670 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
26680 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
26690 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
266a0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79  ate.keyinfo.nKey
266b0 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61  Field+1, preupda
266c0 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
266d0 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
266e0 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
266f0 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
26700 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70  d+1, preupdate.p
26710 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
26720 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
26730 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
26740 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26750 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
26760 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
26770 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
26780 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
26790 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
267a0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
267b0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
267c0 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
267d0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
267e0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
267f0 20 2a 2f 0a                                       */.