/ Hex Artifact Content
Login

Artifact f6cd3f538697aff71f1ef92a769feb18173eb9df80372f570d741a237ea30628:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 76 2d 3e   int nNew = (v->
1180: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
1190: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  v->nOpAlloc*2 : 
11a0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
11c0: 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (v->nOpAllo
11d0: 63 20 3f 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? v->nOpAlloc*
11e0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
11f0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
1200: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1210: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
1220: 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  /* Ensure that t
1230: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 56 44 42  he size of a VDB
1240: 45 20 64 6f 65 73 20 6e 6f 74 20 67 72 6f 77 20  E does not grow 
1250: 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 20 20 69  too large */.  i
1260: 66 28 20 6e 4e 65 77 20 3e 20 70 2d 3e 64 62 2d  f( nNew > p->db-
1270: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1280: 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 20 29 7b  IMIT_VDBE_OP] ){
1290: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
12a0: 61 75 6c 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  ault(p->db);.   
12b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12c0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  OMEM;.  }..  ass
12d0: 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f  ert( nOp<=(1024/
12e0: 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20  sizeof(Op)) );. 
12f0: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28   assert( nNew>=(
1300: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
1310: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
1320: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
1330: 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65  >db, v->aOp, nNe
1340: 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  w*sizeof(Op));. 
1350: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1360: 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20   p->szOpAlloc = 
1370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1380: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
1390: 3b 0a 20 20 20 20 76 2d 3e 6e 4f 70 41 6c 6c 6f  ;.    v->nOpAllo
13a0: 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  c = p->szOpAlloc
13b0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
13c0: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
13d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
13e0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
13f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1400: 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  PT);.}..#ifdef S
1410: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
1420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
1430: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
1440: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1450: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
1460: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
1470: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
1480: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
1490: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
14a0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
14b0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
14d0: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
14e0: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
14f0: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
1500: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
1510: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
1520: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
1530: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
1540: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
1550: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
1560: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
1570: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
1580: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
1590: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
15a0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
15b0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
15c0: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
15d0: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
15e0: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
15f0: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
1600: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
1610: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
1620: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
1630: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
1640: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
1650: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
1660: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
1670: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
1680: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
1690: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
16a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
16b0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
16c0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
16d0: 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f  INLINE int growO
16e0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
16f0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1700: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61  p2, int p3){.  a
1710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
1720: 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  oc<=p->nOp );.  
1730: 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28  if( growOpArray(
1740: 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20 31  p, 1) ) return 1
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
1760: 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29  OpAlloc>p->nOp )
1770: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
1780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1790: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
17a0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
17b0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
17c0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
17d0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
17e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
17f0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
1800: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
1810: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1820: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1830: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30  .  assert( op>=0
1840: 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20   && op<0xff );. 
1850: 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63   if( p->nOpAlloc
1860: 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=i ){.    retur
1870: 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70 2c  n growOp3(p, op,
1880: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1890: 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20  }.  p->nOp++;.  
18a0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
18b0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
18c0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d  = (u8)op;.  pOp-
18d0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
18e0: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
18f0: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
1900: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
1910: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
1920: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
1930: 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c  USED;.#ifdef SQL
1940: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
1950: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f  IN_COMMENTS.  pO
1960: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
1970: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1980: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1990: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
19a0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
19b0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pTrace ){.    sq
19c0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
19d0: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
19e0: 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64  ]);.    test_add
19f0: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b  op_breakpoint();
1a00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
1a10: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
1a20: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
1a30: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
1a40: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
1a50: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1a60: 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72  ERAGE.  pOp->iSr
1a70: 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69  cLine = 0;.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1a90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1aa0: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1ab0: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad0: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1ae0: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1af0: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1b00: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b10: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
1b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b30: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
1b40: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1b50: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
1b60: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1b70: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1b80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1b90: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1ba0: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  1, p2, 0);.}../*
1bb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1bc0: 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  or an unconditio
1bd0: 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  nal jump to inst
1be0: 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a 2f  ruction iDest.*/
1bf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1c00: 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69 6e  Goto(Vdbe *p, in
1c10: 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74 75  t iDest){.  retu
1c20: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1c30: 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp3(p, OP_Goto,
1c40: 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 7d   0, iDest, 0);.}
1c50: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
1c60: 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20  de to cause the 
1c70: 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 62  string zStr to b
1c80: 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a 2a  e loaded into.**
1c90: 20 72 65 67 69 73 74 65 72 20 69 44 65 73 74 0a   register iDest.
1ca0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1cb0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64 62  beLoadString(Vdb
1cc0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c  e *p, int iDest,
1cd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
1ce0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
1cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1d00: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
1d10: 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72 2c   iDest, 0, zStr,
1d20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
1d30: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
1d40: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75 6c   initializes mul
1d50: 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 73 20  tiple registers 
1d60: 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e 74  to string or int
1d70: 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  eger.** constant
1d80: 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  s.  The register
1d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 44 65  s begin with iDe
1da0: 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20  st and increase 
1db0: 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a 2a  consecutively..*
1dc0: 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20 69  * One register i
1dd0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f  s initialized fo
1de0: 72 20 65 61 63 68 20 63 68 61 72 61 63 67 74 65  r each characgte
1df0: 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20 20  r in zTypes[].  
1e00: 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22 20  For each.** "s" 
1e10: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54 79  character in zTy
1e20: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1e30: 74 65 72 20 69 73 20 61 20 73 74 72 69 6e 67 20  ter is a string 
1e40: 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1e50: 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20  is.** not NULL, 
1e60: 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74 68  or OP_Null if th
1e70: 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6c  e value is a nul
1e80: 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72 20  l pointer.  For 
1e90: 65 61 63 68 20 22 69 22 20 63 68 61 72 61 63 74  each "i" charact
1ea0: 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73 5b  er.** in zTypes[
1eb0: 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ], the register 
1ec0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1ed0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  o an integer..**
1ee0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
1ef0: 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e 6f 74   string does not
1f00: 20 65 6e 64 20 77 69 74 68 20 22 58 22 20 74 68   end with "X" th
1f10: 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  en an OP_ResultR
1f20: 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  ow instruction.*
1f30: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  * is generated f
1f40: 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  or the values in
1f50: 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  serted..*/.void 
1f60: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1f70: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1f80: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1f90: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1fa0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1fb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1fc0: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1fd0: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1fe0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1ff0: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
2000: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
2010: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
2020: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
2030: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
2040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2050: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
2060: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
2070: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
2080: 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st+i, 0, z, 0);.
2090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
20a0: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 73 71  ='i' ){.      sq
20b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20c0: 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 76  p, OP_Integer, v
20d0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 2c 20  a_arg(ap, int), 
20e0: 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 7d 65  iDest+i);.    }e
20f0: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
2100: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f  skip_op_resultro
2110: 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  w;.    }.  }.  s
2120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2130: 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (p, OP_ResultRow
2140: 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 6b 69  , iDest, i);.ski
2150: 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3a 0a  p_op_resultrow:.
2160: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
2170: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2180: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2190: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
21a0: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
21b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
21c0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
21d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
21e0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
21f0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
2200: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
2210: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
2220: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
2230: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
2240: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
2250: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
2260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2270: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
2280: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
2290: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
22a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
22b0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
22c0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
22d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
22e0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
22f0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
2300: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
2310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2320: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
2330: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2340: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2350: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
2360: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
2370: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
2380: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
2390: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
23a0: 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49  alue with a P4_I
23b0: 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45  NT64 or.** P4_RE
23c0: 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  AL type..*/.int 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23e0: 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70  4Dup8(.  Vdbe *p
23f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2400: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
2410: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
2420: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
2430: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
2440: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
2450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2460: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2470: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2490: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
24a0: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
24b0: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
24c0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
24d0: 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f   u8 *zP4,      /
24e0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
2500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
2510: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
2520: 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70  ){.  char *p4cop
2530: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
2540: 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33  locRawNN(sqlite3
2550: 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20  VdbeDb(p), 8);. 
2560: 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65   if( p4copy ) me
2570: 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34  mcpy(p4copy, zP4
2580: 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 8);.  return s
2590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25a0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
25b0: 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79  p3, p4copy, p4ty
25c0: 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  pe);.}..#ifndef 
25d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
25e0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AIN./*.** Return
25f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2600: 74 68 65 20 63 75 72 72 65 6e 74 20 45 58 50 4c  the current EXPL
2610: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 62  AIN QUERY PLAN b
2620: 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 20 6d 65  aseline..** 0 me
2630: 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69  ans "none"..*/.i
2640: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  nt sqlite3VdbeEx
2650: 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 61 72 73  plainParent(Pars
2660: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
2670: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
2680: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2690: 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  lain==0 ) return
26a0: 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 71 6c 69   0;.  pOp = sqli
26b0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 50 61  te3VdbeGetOp(pPa
26c0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
26d0: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 29  se->addrExplain)
26e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
26f0: 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  p2;.}../*.** Set
2700: 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
2710: 6b 70 6f 69 6e 74 20 6f 6e 20 74 68 65 20 66 6f  kpoint on the fo
2720: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
2730: 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 6d  in order to.** m
2740: 6f 6e 69 74 6f 72 20 74 68 65 20 45 58 50 4c 41  onitor the EXPLA
2750: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2760: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a  de generation..*
2770: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
2780: 4c 49 54 45 5f 44 45 42 55 47 29 0a 76 6f 69 64  LITE_DEBUG).void
2790: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
27a0: 72 65 61 6b 70 6f 69 6e 74 28 63 6f 6e 73 74 20  reakpoint(const 
27b0: 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20  char *z1, const 
27c0: 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 28 76 6f  char *z2){.  (vo
27d0: 69 64 29 7a 31 3b 0a 20 20 28 76 6f 69 64 29 7a  id)z1;.  (void)z
27e0: 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  2;.}.#endif../*.
27f0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 4f 50 5f  ** Add a new OP_
2800: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
2810: 66 20 74 68 65 20 62 50 75 73 68 20 66 6c 61 67  f the bPush flag
2820: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d   is true, then m
2830: 61 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ake this opcode 
2840: 74 68 65 20 70 61 72 65 6e 74 20 66 6f 72 0a 2a  the parent for.*
2850: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 45 78 70  * subsequent Exp
2860: 6c 61 69 6e 73 20 75 6e 74 69 6c 20 73 71 6c 69  lains until sqli
2870: 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e 50 6f  te3VdbeExplainPo
2880: 70 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  p() is called..*
2890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
28a0: 62 65 45 78 70 6c 61 69 6e 28 50 61 72 73 65 20  beExplain(Parse 
28b0: 2a 70 50 61 72 73 65 2c 20 75 38 20 62 50 75 73  *pParse, u8 bPus
28c0: 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
28d0: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 23 69 66 6e 64  Fmt, ...){.#ifnd
28e0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 69 6e 63 6c    /* Always incl
2900: 75 64 65 20 74 68 65 20 4f 50 5f 45 78 70 6c 61  ude the OP_Expla
2910: 69 6e 20 6f 70 63 6f 64 65 73 20 69 66 20 53 51  in opcodes if SQ
2920: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
2930: 66 69 6e 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  fined..  ** But 
2940: 6f 6d 69 74 20 74 68 65 6d 20 28 66 6f 72 20 70  omit them (for p
2950: 65 72 66 6f 72 6d 61 6e 63 65 29 20 64 75 72 69  erformance) duri
2960: 6e 67 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75  ng production bu
2970: 69 6c 64 73 20 2a 2f 0a 20 20 69 66 28 20 70 50  ilds */.  if( pP
2980: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2990: 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20   ).#endif.  {.  
29a0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
29b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 76    Vdbe *v;.    v
29c0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 69  a_list ap;.    i
29d0: 6e 74 20 69 54 68 69 73 3b 0a 20 20 20 20 76 61  nt iThis;.    va
29e0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
29f0: 3b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  ;.    zMsg = sql
2a00: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 50 61  ite3VMPrintf(pPa
2a10: 72 73 65 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61  rse->db, zFmt, a
2a20: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2a30: 70 29 3b 0a 20 20 20 20 76 20 3d 20 70 50 61 72  p);.    v = pPar
2a40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 69  se->pVdbe;.    i
2a50: 54 68 69 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  This = v->nOp;. 
2a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a70: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
2a80: 69 6e 2c 20 69 54 68 69 73 2c 20 70 50 61 72 73  in, iThis, pPars
2a90: 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  e->addrExplain, 
2aa0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2ab0: 20 20 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 50           zMsg, P
2ac0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
2ad0: 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 72  sqlite3ExplainBr
2ae0: 65 61 6b 70 6f 69 6e 74 28 62 50 75 73 68 3f 22  eakpoint(bPush?"
2af0: 50 55 53 48 22 3a 22 22 2c 20 73 71 6c 69 74 65  PUSH":"", sqlite
2b00: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
2b10: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28  ->p4.z);.    if(
2b20: 20 62 50 75 73 68 29 7b 0a 20 20 20 20 20 20 70   bPush){.      p
2b30: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
2b40: 69 6e 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20  in = iThis;.    
2b50: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2b60: 6f 70 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  op the EXPLAIN Q
2b70: 55 45 52 59 20 50 4c 41 4e 20 73 74 61 63 6b 20  UERY PLAN stack 
2b80: 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  one level..*/.vo
2b90: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  id sqlite3VdbeEx
2ba0: 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 65 20 2a  plainPop(Parse *
2bb0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
2bc0: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2bd0: 69 6e 74 28 22 50 4f 50 22 2c 20 30 29 3b 0a 20  int("POP", 0);. 
2be0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70   pParse->addrExp
2bf0: 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 56 64  lain = sqlite3Vd
2c00: 62 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28  beExplainParent(
2c10: 70 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69  pParse);.}.#endi
2c20: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c30: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
2c40: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
2c50: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
2c60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
2c70: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
2c80: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
2c90: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
2ca0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
2cb0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
2cc0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
2cd0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
2ce0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
2cf0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
2d00: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
2d10: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2d20: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
2d30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
2d40: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2d50: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
2d60: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
2d70: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
2d80: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
2d90: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
2da0: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
2db0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  j;.  sqlite3Vdbe
2dc0: 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72  AddOp4(p, OP_Par
2dd0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
2de0: 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  , 0, zWhere, P4_
2df0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
2e00: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
2e10: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
2e20: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
2e30: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
2e40: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
2e50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
2e60: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
2e70: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e80: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2e90: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2ea0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2eb0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2ec0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
2ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2ee0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f10: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
2f20: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2f30: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2f40: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2f50: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2f60: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f90: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
2fa0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
2fb0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
2fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
2fd0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
2fe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
2ff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
3000: 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70  ){.    VdbeOp *p
3010: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
3020: 72 5d 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  r];.    pOp->p4t
3030: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
3040: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
3050: 70 34 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p4;.  }.  return
3060: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73   addr;.}../* Ins
3070: 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ert the end of a
3080: 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76   co-routine.*/.v
3090: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
30a0: 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65  ndCoroutine(Vdbe
30b0: 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c   *v, int regYiel
30c0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d){.  sqlite3Vdb
30d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
30e0: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  dCoroutine, regY
30f0: 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  ield);..  /* Cle
3100: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
3110: 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c   register cache,
3120: 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e   thereby ensurin
3130: 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a  g that each.  **
3140: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20   co-routine has 
3150: 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64  its own independ
3160: 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73  ent set of regis
3170: 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f  ters, because co
3180: 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d  -routines.  ** m
3190: 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69  ight expect thei
31a0: 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62  r registers to b
31b0: 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f  e preserved acro
31c0: 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20  ss an OP_Yield, 
31d0: 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f  and.  ** that co
31e0: 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65  uld cause proble
31f0: 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ms if two or mor
3200: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72  e co-routines ar
3210: 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  e using the same
3220: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
3230: 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20  register..  */. 
3240: 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d   v->pParse->nTem
3250: 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70  pReg = 0;.  v->p
3260: 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
3270: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
3280: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
3290: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
32a0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
32b0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
32c0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
32d0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
32e0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
32f0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
3300: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
3310: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
3320: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
3330: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
3340: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
3350: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
3360: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
3370: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
3380: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
3390: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
33a0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
33b0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
33c0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
33d0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
33e0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
33f0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
3400: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
3410: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
3420: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
3430: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
3440: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
3450: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
3460: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
3470: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
3480: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
3490: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
34a0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
34b0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
34c0: 65 64 2e 0a 2a 2a 20 28 4c 61 74 65 72 3a 29 20  ed..** (Later:) 
34d0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 74 72 75  This is only tru
34e0: 65 20 66 6f 72 20 6f 70 63 6f 64 65 73 20 74 68  e for opcodes th
34f0: 61 74 20 68 61 76 65 20 74 68 65 20 4f 50 46 4c  at have the OPFL
3500: 47 5f 4a 55 4d 50 0a 2a 2a 20 70 72 6f 70 65 72  G_JUMP.** proper
3510: 74 79 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ty..**.** Variab
3520: 6c 65 20 75 73 61 67 65 20 6e 6f 74 65 73 3a 0a  le usage notes:.
3530: 2a 2a 0a 2a 2a 20 20 20 20 20 50 61 72 73 65 2e  **.**     Parse.
3540: 61 4c 61 62 65 6c 5b 78 5d 20 20 20 20 20 53 74  aLabel[x]     St
3550: 6f 72 65 73 20 74 68 65 20 61 64 64 72 65 73 73  ores the address
3560: 20 74 68 61 74 20 74 68 65 20 78 2d 74 68 20 6c   that the x-th l
3570: 61 62 65 6c 20 72 65 73 6f 6c 76 65 73 0a 2a 2a  abel resolves.**
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 20 20 20 20 20 20 69 6e 74 6f 2e 20 20           into.  
35a0: 46 6f 72 20 74 65 73 74 69 6e 67 20 28 53 51 4c  For testing (SQL
35b0: 49 54 45 5f 44 45 42 55 47 29 2c 20 75 6e 72 65  ITE_DEBUG), unre
35c0: 73 6f 6c 76 65 64 0a 2a 2a 20 20 20 20 20 20 20  solved.**       
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 6c 61 62 65 6c 73 20 73 74 6f 72 65 73 20    labels stores 
35f0: 2d 31 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  -1, but that is 
3600: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  not required..**
3610: 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61 62 65       Parse.nLabe
3620: 6c 41 6c 6c 6f 63 20 20 20 4e 75 6d 62 65 72 20  lAlloc   Number 
3630: 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  of slots allocat
3640: 65 64 20 74 6f 20 50 61 72 73 65 2e 61 4c 61 62  ed to Parse.aLab
3650: 65 6c 5b 5d 0a 2a 2a 20 20 20 20 20 50 61 72 73  el[].**     Pars
3660: 65 2e 6e 4c 61 62 65 6c 20 20 20 20 20 20 20 20  e.nLabel        
3670: 54 68 65 20 2a 6e 65 67 61 74 69 76 65 2a 20 6f  The *negative* o
3680: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
3690: 6c 61 62 65 6c 73 20 74 68 61 74 20 68 61 76 65  labels that have
36a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 65 6e              been
36c0: 20 69 73 73 75 65 64 2e 20 20 54 68 65 20 6e 65   issued.  The ne
36d0: 67 61 74 69 76 65 20 69 73 20 73 74 6f 72 65 64  gative is stored
36e0: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 74 68 61 74 20 67 69 76 65 73 20 61      that gives a
3710: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
3720: 72 6f 76 65 6d 65 6e 74 20 6f 76 65 72 20 73 74  rovement over st
3730: 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
3760: 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2e 0a  positive value..
3770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3780: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 50 61 72 73  beMakeLabel(Pars
3790: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 72 65  e *pParse){.  re
37a0: 74 75 72 6e 20 2d 2d 70 50 61 72 73 65 2d 3e 6e  turn --pParse->n
37b0: 4c 61 62 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Label;.}../*.** 
37c0: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
37d0: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
37e0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
37f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
3800: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
3810: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
3820: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
3830: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
3840: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
3850: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
3860: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 73 74 61  eLabel()..*/.sta
3870: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
3880: 49 4e 45 20 76 6f 69 64 20 72 65 73 69 7a 65 52  INE void resizeR
3890: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 50 61 72 73  esolveLabel(Pars
38a0: 65 20 2a 70 2c 20 56 64 62 65 20 2a 76 2c 20 69  e *p, Vdbe *v, i
38b0: 6e 74 20 6a 29 7b 0a 20 20 69 6e 74 20 6e 4e 65  nt j){.  int nNe
38c0: 77 53 69 7a 65 20 3d 20 31 30 20 2d 20 70 2d 3e  wSize = 10 - p->
38d0: 6e 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 61 4c 61  nLabel;.  p->aLa
38e0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52  bel = sqlite3DbR
38f0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e  eallocOrFree(p->
3900: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20  db, p->aLabel,. 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 6e 4e 65 77 53 69 7a 65 2a 73 69 7a      nNewSize*siz
3930: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
3940: 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61  ));.  if( p->aLa
3950: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  bel==0 ){.    p-
3960: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 30  >nLabelAlloc = 0
3970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
3980: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3990: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
39a0: 72 28 69 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c  r(i=p->nLabelAll
39b0: 6f 63 3b 20 69 3c 6e 4e 65 77 53 69 7a 65 3b 20  oc; i<nNewSize; 
39c0: 69 2b 2b 29 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  i++) p->aLabel[i
39d0: 5d 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20  ] = -1;.#endif. 
39e0: 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f     p->nLabelAllo
39f0: 63 20 3d 20 6e 4e 65 77 53 69 7a 65 3b 0a 20 20  c = nNewSize;.  
3a00: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
3a10: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 76   v->nOp;.  }.}.v
3a20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
3a30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
3a40: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
3a50: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
3a60: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41  rse;.  int j = A
3a70: 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74  DDR(x);.  assert
3a80: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
3a90: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
3aa0: 20 61 73 73 65 72 74 28 20 6a 3c 2d 70 2d 3e 6e   assert( j<-p->n
3ab0: 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Label );.  asser
3ac0: 74 28 20 6a 3e 3d 30 20 29 3b 0a 23 69 66 64 65  t( j>=0 );.#ifde
3ad0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
3ae0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3af0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3b00: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3b10: 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c 56 45   printf("RESOLVE
3b20: 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 64 5c   LABEL %d to %d\
3b30: 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 3b 0a  n", x, v->nOp);.
3b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
3b50: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
3b60: 2b 20 70 2d 3e 6e 4c 61 62 65 6c 20 3c 20 30 20  + p->nLabel < 0 
3b70: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 52 65 73  ){.    resizeRes
3b80: 6f 6c 76 65 4c 61 62 65 6c 28 70 2c 76 2c 6a 29  olveLabel(p,v,j)
3b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3ba0: 73 73 65 72 74 28 20 70 2d 3e 61 4c 61 62 65 6c  ssert( p->aLabel
3bb0: 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b 20 2f 2a 20  [j]==(-1) ); /* 
3bc0: 4c 61 62 65 6c 73 20 6d 61 79 20 6f 6e 6c 79 20  Labels may only 
3bd0: 62 65 20 72 65 73 6f 6c 76 65 64 20 6f 6e 63 65  be resolved once
3be0: 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   */.    p->aLabe
3bf0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
3c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b   }.}../*.** Mark
3c10: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
3c20: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
3c30: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
3c40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3c50: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
3c60: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
3c70: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
3c80: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
3c90: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
3ca0: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
3cb0: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  n multiple times
3cc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3cd0: 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56 64  3VdbeReusable(Vd
3ce0: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e  be *p){.  p->run
3cf0: 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d 0a  OnlyOnce = 0;.}.
3d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
3d10: 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41  EBUG /* sqlite3A
3d20: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3d30: 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  logic */../*.** 
3d40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  The following ty
3d50: 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20  pe and function 
3d60: 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65 72  are used to iter
3d70: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
3d80: 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20  opcodes.** in a 
3d90: 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61  Vdbe main progra
3da0: 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68  m and each of th
3db0: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28  e sub-programs (
3dc0: 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61 79  triggers) it may
3dd0: 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65   .** invoke dire
3de0: 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74  ctly or indirect
3df0: 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  ly. It should be
3e00: 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73   used as follows
3e10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f  :.**.**   Op *pO
3e20: 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74  p;.**   VdbeOpIt
3e30: 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20  er sIter;.**.** 
3e40: 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c    memset(&sIter,
3e50: 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72   0, sizeof(sIter
3e60: 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76  ));.**   sIter.v
3e70: 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20 20   = v;           
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65   // v is of type
3ea0: 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69   Vdbe* .**   whi
3eb0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
3ec0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20 29  rNext(&sIter)) )
3ed0: 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73  {.**     // Do s
3ee0: 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f  omething with pO
3ef0: 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71  p.**   }.**   sq
3f00: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
3f10: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
3f20: 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20  .** .*/.typedef 
3f30: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
3f40: 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74  r VdbeOpIter;.st
3f50: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
3f60: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f80: 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61 74  * Vdbe to iterat
3f90: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70  e through the op
3fa0: 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75  codes of */.  Su
3fb0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
3fc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3fd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
3fe0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20   */.  int nSub; 
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4010: 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a  tries in apSub *
4020: 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20  /.  int iAddr;  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4040: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
4050: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4060: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
4070: 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   iSub;          
4080: 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d          /* 0 = m
4090: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d  ain program, 1 =
40a0: 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72   first sub-progr
40b0: 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74  am etc. */.};.st
40c0: 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e  atic Op *opIterN
40d0: 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a  ext(VdbeOpIter *
40e0: 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  p){.  Vdbe *v = 
40f0: 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74  p->v;.  Op *pRet
4100: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b   = 0;.  Op *aOp;
4110: 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69  .  int nOp;..  i
4120: 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e  f( p->iSub<=p->n
4130: 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20  Sub ){..    if( 
4140: 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20  p->iSub==0 ){.  
4150: 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70      aOp = v->aOp
4160: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d  ;.      nOp = v-
4170: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >nOp;.    }else{
4180: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e  .      aOp = p->
4190: 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d  apSub[p->iSub-1]
41a0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
41b0: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
41c0: 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub-1]->nOp;.   
41d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
41e0: 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a  ->iAddr<nOp );..
41f0: 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b      pRet = &aOp[
4200: 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70  p->iAddr];.    p
4210: 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69  ->iAddr++;.    i
4220: 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70  f( p->iAddr==nOp
4230: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75   ){.      p->iSu
4240: 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41  b++;.      p->iA
4250: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ddr = 0;.    }. 
4260: 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e   .    if( pRet->
4270: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
4280: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69  OGRAM ){.      i
4290: 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e  nt nByte = (p->n
42a0: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
42b0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
42c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
42d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75  or(j=0; j<p->nSu
42e0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
42f0: 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d   if( p->apSub[j]
4300: 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  ==pRet->p4.pProg
4310: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
4320: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4330: 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20  ==p->nSub ){.   
4340: 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20       p->apSub = 
4350: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
4360: 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d  OrFree(v->db, p-
4370: 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a  >apSub, nByte);.
4380: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e          if( !p->
4390: 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  apSub ){.       
43a0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
43b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
43c0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70        p->apSub[p
43d0: 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74  ->nSub++] = pRet
43e0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
43f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
4410: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
4420: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
4430: 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20   program stored 
4440: 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69  in the VM associ
4450: 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73 65  ated with pParse
4460: 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e   may.** throw an
4470: 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e   ABORT exception
4480: 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73 74   (causing the st
4490: 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  atement, but not
44a0: 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
44b0: 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c  ion.** to be rol
44c0: 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20  led back). This 
44d0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
44e0: 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72  e if the main pr
44f0: 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20  ogram or any.** 
4500: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e  sub-programs con
4510: 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65  tains any of the
4520: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
4530: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
4540: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
4550: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
4560: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
4570: 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20    OP_HaltIfNull 
4580: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
4590: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
45a0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
45b0: 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a  *  OP_Destroy.**
45c0: 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65     *  OP_VUpdate
45d0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e  .**   *  OP_VRen
45e0: 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46  ame.**   *  OP_F
45f0: 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32  kCounter with P2
4600: 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ==0 (immediate f
4610: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
4620: 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f  raint).**   *  O
4630: 50 5f 43 72 65 61 74 65 42 74 72 65 65 2f 42 54  P_CreateBtree/BT
4640: 52 45 45 5f 49 4e 54 4b 45 59 20 61 6e 64 20 4f  REE_INTKEY and O
4650: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
4660: 0a 2a 2a 20 20 20 20 20 20 28 66 6f 72 20 43 52  .**      (for CR
4670: 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45  EATE TABLE AS SE
4680: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
4690: 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20  Then check that 
46a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72  the value of Par
46b0: 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74  se.mayAbort is t
46c0: 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f  rue if an.** ABO
46d0: 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e  RT may be thrown
46e0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
46f0: 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75  wise. Return tru
4700: 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20  e if it does.** 
4710: 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20  match, or false 
4720: 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20  otherwise. This 
4730: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65  function is inte
4740: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
4750: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e  as.** part of an
4760: 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
4770: 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  t in the compile
4780: 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  r. Similar to:.*
4790: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73  *.**   assert( s
47a0: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
47b0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d  MayAbort(pParse-
47c0: 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e  >pVdbe, pParse->
47d0: 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a  mayAbort) );.*/.
47e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
47f0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64  ssertMayAbort(Vd
4800: 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62  be *v, int mayAb
4810: 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41  ort){.  int hasA
4820: 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  bort = 0;.  int 
4830: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30  hasFkCounter = 0
4840: 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74  ;.  int hasCreat
4850: 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  eTable = 0;.  in
4860: 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  t hasInitCorouti
4870: 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  ne = 0;.  Op *pO
4880: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
4890: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
48a0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
48b0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
48c0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
48d0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
48e0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
48f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
4900: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
4910: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
4920: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
4930: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
4940: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
4950: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
4960: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 44  || opcode==OP_VD
4970: 65 73 74 72 6f 79 0a 20 20 20 20 20 7c 7c 20 28  estroy.     || (
4980: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
4990: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
49a0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
49b0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
49c0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
49d0: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
49e0: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
49f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
4a00: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
4a10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a20: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
4a30: 43 72 65 61 74 65 42 74 72 65 65 20 26 26 20 70  CreateBtree && p
4a40: 4f 70 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e  Op->p3==BTREE_IN
4a50: 54 4b 45 59 20 29 20 68 61 73 43 72 65 61 74 65  TKEY ) hasCreate
4a60: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69  Table = 1;.    i
4a70: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  f( opcode==OP_In
4a80: 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61  itCoroutine ) ha
4a90: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
4aa0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
4ab0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
4ac0: 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  KEY.    if( opco
4ad0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
4ae0: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
4af0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  & pOp->p2==1 ){.
4b00: 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74        hasFkCount
4b10: 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  er = 1;.    }.#e
4b20: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
4b30: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
4b40: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20  sIter.apSub);.. 
4b50: 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20   /* Return true 
4b60: 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  if hasAbort==may
4b70: 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d  Abort. Or if a m
4b80: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
4b90: 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20  curred..  ** If 
4ba0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74  malloc failed, t
4bb0: 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20  hen the while() 
4bc0: 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e  loop above may n
4bd0: 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64  ot have iterated
4be0: 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c  .  ** through al
4bf0: 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61  l opcodes and ha
4c00: 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65  sAbort may be se
4c10: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52  t incorrectly. R
4c20: 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20  eturn.  ** true 
4c30: 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f  for this case to
4c40: 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73   prevent the ass
4c50: 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c  ert() in the cal
4c60: 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20  lers frame.  ** 
4c70: 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a  from failing.  *
4c80: 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e  /.  return ( v->
4c90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4ca0: 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   || hasAbort==ma
4cb0: 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43  yAbort || hasFkC
4cc0: 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20  ounter.         
4cd0: 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61       || (hasCrea
4ce0: 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e  teTable && hasIn
4cf0: 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a  itCoroutine) );.
4d00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4d10: 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73  TE_DEBUG - the s
4d20: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
4d30: 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20  bort() function 
4d40: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
4d50: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e  E_DEBUG./*.** In
4d60: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69  crement the nWri
4d70: 74 65 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68  te counter in th
4d80: 65 20 56 44 42 45 20 69 66 20 74 68 65 20 63 75  e VDBE if the cu
4d90: 72 73 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a  rsor is not an.*
4da0: 2a 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  * ephemeral curs
4db0: 6f 72 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75  or, or if the cu
4dc0: 72 73 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73  rsor argument is
4dd0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
4de0: 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72  qlite3VdbeIncrWr
4df0: 69 74 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20  iteCounter(Vdbe 
4e00: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
4e10: 70 43 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30  pC){.  if( pC==0
4e20: 0a 20 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72  .   || (pC->eCur
4e30: 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f  Type!=CURTYPE_SO
4e40: 52 54 45 52 0a 20 20 20 20 20 20 20 26 26 20 70  RTER.       && p
4e50: 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52  C->eCurType!=CUR
4e60: 54 59 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20  TYPE_PSEUDO.    
4e70: 20 20 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68     && !pC->isEph
4e80: 65 6d 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20  emeral).  ){.   
4e90: 20 70 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20   p->nWrite++;.  
4ea0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  }.}.#endif..#ifd
4eb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4ec0: 2f 2a 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20  /*.** Assert if 
4ed0: 61 6e 20 41 62 6f 72 74 20 61 74 20 74 68 69 73  an Abort at this
4ee0: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d   point in time m
4ef0: 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
4f00: 20 63 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61   corrupt.** data
4f10: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
4f20: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
4f30: 62 6f 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70  bortable(Vdbe *p
4f40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4f50: 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e  nWrite==0 || p->
4f60: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
4f70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
4f80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4f90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
4fa0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
4fb0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
4fc0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
4fd0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
4fe0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
4ff0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
5000: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
5010: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
5020: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
5030: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
5040: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
5050: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
5060: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
5070: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
5080: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
5090: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
50a0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
50b0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
50c0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
50d0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
50e0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
50f0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
5100: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
5110: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
5120: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
5130: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
5140: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
5150: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
5160: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
5170: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
5180: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
5190: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
51a0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
51b0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
51c0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
51d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
51e0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
51f0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
5200: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
5210: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
5220: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
5230: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
5240: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
5250: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
5260: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
5270: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
5280: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
5290: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
52a0: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
52b0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
52c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
52d0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
52e0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
52f0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
5300: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
5310: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
5320: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
5330: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
5340: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
5350: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
5360: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
5370: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
5380: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
5390: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
53a0: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
53b0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
53c0: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
53d0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
53e0: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
53f0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
5400: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
5410: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
5420: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
5430: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
5440: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
5450: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
5460: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
5470: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
5480: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
5490: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
54a0: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
54b0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
54c0: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
54d0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
54e0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
54f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
5500: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
5510: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
5520: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
5530: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
5540: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
5550: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
5560: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
5570: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
5580: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
5590: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
55a0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
55b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
55c0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
55d0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
55e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
55f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
5600: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
5610: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
5620: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
5630: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
5640: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
5650: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
5660: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
5670: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
5680: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
5690: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
56a0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
56b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
56c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
56d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
56e0: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
56f0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
5700: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
5710: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
5720: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
5730: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
5740: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
5750: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
5760: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
5770: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
5780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5790: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
57a0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20  OP_Next:.       
57b0: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
57c0: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
57d0: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
57e0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
57f0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
5800: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5810: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
5820: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
5830: 67 65 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20  generator never 
5840: 63 6f 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65  codes any of the
5850: 73 65 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20  se opcodes as a 
5860: 6a 75 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a  jump.          *
5870: 2a 20 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54  * to a label.  T
5880: 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 63  hey are always c
5890: 6f 64 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62  oded as a jump b
58a0: 61 63 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20  ackwards to a . 
58b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77           ** know
58c0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20  n address */.   
58d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
58e0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
58f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5910: 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a  case OP_Prev: {.
5920: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
5930: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
5940: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
5950: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  s;.          pOp
5960: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
5970: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20  VANCE;.         
5980: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e   /* The code gen
5990: 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64  erator never cod
59a0: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  es any of these 
59b0: 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d  opcodes as a jum
59c0: 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  p.          ** t
59d0: 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79  o a label.  They
59e0: 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65   are always code
59f0: 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b  d as a jump back
5a00: 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20  wards to a .    
5a10: 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61        ** known a
5a20: 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20  ddress */.      
5a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5a40: 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  >p2>=0 );.      
5a50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5a60: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
5a70: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5a80: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61  TABLE.        ca
5a90: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
5aa0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5ab0: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20  Op->p2>nMaxArgs 
5ac0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
5ad0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p2;.          
5ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5af0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5b00: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
5b10: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
5b20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5b30: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d  pOp - p->aOp) >=
5b40: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   3 );.          
5b50: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
5b60: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67  opcode==OP_Integ
5b70: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er );.          
5b80: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
5b90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e            if( n>
5ba0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
5bb0: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
5bc0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5bd0: 67 68 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61  gh into the defa
5be0: 75 6c 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ult case */.    
5bf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5c00: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
5c10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f            if( pO
5c20: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
5c30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b         /* The mk
5c40: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69  opcodeh.tcl scri
5c50: 70 74 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67  pt has so arrang
5c60: 65 64 20 74 68 69 6e 67 73 20 74 68 61 74 20 74  ed things that t
5c70: 68 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  he only.        
5c80: 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20      ** non-jump 
5c90: 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61  opcodes less tha
5ca0: 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50  n SQLITE_MX_JUMP
5cb0: 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e  _CODE are guaran
5cc0: 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  teed to.        
5cd0: 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d      ** have non-
5ce0: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
5cf0: 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20  for P2. */.     
5d00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
5d10: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5d20: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
5d30: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
5d40: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
5d50: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28     assert( ADDR(
5d60: 70 4f 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65  pOp->p2)<-pParse
5d70: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
5d80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
5d90: 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f  = aLabel[ADDR(pO
5da0: 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20  p->p2)];.       
5db0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
5dc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
5de0: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
5df0: 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 6f  cl script has so
5e00: 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73   arranged things
5e10: 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20   that the only. 
5e20: 20 20 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70       ** non-jump
5e30: 20 6f 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68   opcodes less th
5e40: 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  an SQLITE_MX_JUM
5e50: 50 5f 43 4f 44 45 20 61 72 65 20 67 75 61 72 61  P_CODE are guara
5e60: 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  nteed to.      *
5e70: 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74  * have non-negat
5e80: 69 76 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50  ive values for P
5e90: 32 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  2. */.      asse
5ea0: 72 74 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  rt( (sqlite3Opco
5eb0: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
5ec0: 6f 70 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55  opcode]&OPFLG_JU
5ed0: 4d 50 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  MP)==0 || pOp->p
5ee0: 32 3e 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  2>=0);.    }.   
5ef0: 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70   if( pOp==p->aOp
5f00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f   ) break;.    pO
5f10: 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p--;.  }.  sqlit
5f20: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
5f30: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
5f40: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
5f50: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
5f60: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
5f70: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
5f80: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
5f90: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
5fa0: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
5fb0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
5fc0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
5fd0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
5fe0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
5ff0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
6000: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
6010: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6020: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
6030: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
6040: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6050: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
6060: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
6070: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 74  * Verify that at
6080: 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20   least N opcode 
6090: 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
60a0: 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74  ble in p without
60b0: 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61  .** having to ma
60c0: 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70  lloc for more sp
60d0: 61 63 65 20 28 65 78 63 65 70 74 20 77 68 65 6e  ace (except when
60e0: 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a   compiled using.
60f0: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ** SQLITE_TEST_R
6100: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20  EALLOC_STRESS). 
6110: 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   This interface 
6120: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
6130: 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72  esting.** to ver
6140: 69 66 79 20 74 68 61 74 20 63 65 72 74 61 69 6e  ify that certain
6150: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
6160: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
6170: 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61   can never.** fa
6180: 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20  il due to a OOM 
6190: 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20  fault and hence 
61a0: 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 20  that the return 
61b0: 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71  value from.** sq
61c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
61d0: 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73  st() will always
61e0: 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f   be non-NULL..*/
61f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6200: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
6210: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
6220: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
6230: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
6240: 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f  dbeVerifyNoMallo
6250: 63 52 65 71 75 69 72 65 64 28 56 64 62 65 20 2a  cRequired(Vdbe *
6260: 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
6270: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20  ert( p->nOp + N 
6280: 3c 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  <= p->nOpAlloc )
6290: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
62a0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
62b0: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
62c0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
62d0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
62e0: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
62f0: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
6300: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
6310: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
6320: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
6330: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
6340: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
6350: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6360: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
6370: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
6380: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
6390: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
63a0: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
63b0: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
63c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
63d0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
63e0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
63f0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
6400: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
6410: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
6420: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
6430: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6440: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
6450: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6460: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
6470: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
6480: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6490: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
64a0: 61 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72  a single OP_Abor
64b0: 74 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68  table opcode) th
64c0: 61 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66  at will.** verif
64d0: 79 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  y that the VDBE 
64e0: 70 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65  program can safe
64f0: 6c 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e  ly call Abort in
6500: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
6510: 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20  context..*/.#if 
6520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6530: 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74  EBUG).void sqlit
6540: 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
6550: 74 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69  table(Vdbe *p, i
6560: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69  nt onError){.  i
6570: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
6580: 62 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64  bort ) sqlite3Vd
6590: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41  beAddOp0(p, OP_A
65a0: 62 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e  bortable);.}.#en
65b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
65c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
65d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
65e0: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
65f0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
6600: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
6610: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
6620: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
6630: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
6640: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
6650: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
6660: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
6670: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
6680: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
6690: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
66a0: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
66b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
66c0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
66d0: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
66e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
66f0: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
6700: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
6710: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
6720: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
6730: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
6740: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
6750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
6760: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
6770: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
6780: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
6790: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
67a0: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
67b0: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
67c0: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
67d0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
67e0: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
67f0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
6800: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
6810: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
6820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6830: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
6840: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
6850: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
6860: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
6870: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
6880: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
6890: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
68a0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
68b0: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
68c0: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
68d0: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
68e0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
68f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
6900: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
6910: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
6920: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
6930: 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69   Return a.** poi
6940: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
6950: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65  t operation inse
6960: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d  rted..**.** Non-
6970: 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74  zero P2 argument
6980: 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75  s to jump instru
6990: 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d  ctions are autom
69a0: 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65  atically adjuste
69b0: 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  d.** so that the
69c0: 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20   jump target is 
69d0: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
69e0: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
69f0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
6a00: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6a10: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
6a20: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
6a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6a40: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
6a50: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
6a60: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6a90: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
6aa0: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
6ab0: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
6ac0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
6ad0: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
6ae0: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
6b10: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
6b20: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
6b30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
6b40: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
6b50: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
6b60: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6b70: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6b80: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6b90: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
6ba0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
6bb0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20   growOpArray(p, 
6bc0: 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nOp) ){.    retu
6bd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72  rn 0;.  }.  pFir
6be0: 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e  st = pOut = &p->
6bf0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66  aOp[p->nOp];.  f
6c00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
6c10: 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b  ++, aOp++, pOut+
6c20: 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70  +){.    pOut->op
6c30: 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f  code = aOp->opco
6c40: 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31  de;.    pOut->p1
6c50: 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20   = aOp->p1;.    
6c60: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e  pOut->p2 = aOp->
6c70: 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p2;.    assert( 
6c80: 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  aOp->p2>=0 );.  
6c90: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70    if( (sqlite3Op
6ca0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70  codeProperty[aOp
6cb0: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
6cc0: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f  G_JUMP)!=0 && aO
6cd0: 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
6ce0: 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e   pOut->p2 += p->
6cf0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nOp;.    }.    p
6d00: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
6d10: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
6d20: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
6d30: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
6d40: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
6d50: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
6d60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
6d70: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
6d80: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
6d90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
6da0: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
6db0: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
6dc0: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
6dd0: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
6de0: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
6df0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
6e00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
6e10: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
6e20: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
6e30: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
6e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
6e50: 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f  intOp(0, i+p->nO
6e60: 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e  p, &p->aOp[i+p->
6e70: 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  nOp]);.    }.#en
6e80: 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70  dif.  }.  p->nOp
6e90: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72   += nOp;.  retur
6ea0: 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66  n pFirst;.}..#if
6eb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6ec0: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
6ed0: 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64  STATUS)./*.** Ad
6ee0: 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
6ef0: 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74  e array of count
6f00: 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ers managed by s
6f10: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
6f20: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69  status()..*/.voi
6f30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61  d sqlite3VdbeSca
6f40: 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20  nStatus(.  Vdbe 
6f50: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d             /* VM
6f70: 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74   to add scanstat
6f80: 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  us() to */.  int
6f90: 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20   addrExplain,   
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6fb0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78  Address of OP_Ex
6fc0: 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a  plain (or 0) */.
6fd0: 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20    int addrLoop, 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
7000: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20  loop counter */ 
7010: 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74  .  int addrVisit
7020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7030: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
7040: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f   rows visited co
7050: 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73  unter */.  LogEs
7060: 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20  t nEst,         
7070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
7080: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
7090: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
70a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
70b0: 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
70c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
70d0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69  ble or index bei
70e0: 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b  ng scanned */.){
70f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28  .  int nByte = (
7100: 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69  p->nScan+1) * si
7110: 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29  zeof(ScanStatus)
7120: 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a  ;.  ScanStatus *
7130: 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28  aNew;.  aNew = (
7140: 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69  ScanStatus*)sqli
7150: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
7160: 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42  db, p->aScan, nB
7170: 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  yte);.  if( aNew
7180: 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74   ){.    ScanStat
7190: 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77  us *pNew = &aNew
71a0: 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20  [p->nScan++];.  
71b0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c    pNew->addrExpl
71c0: 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69  ain = addrExplai
71d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  n;.    pNew->add
71e0: 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70  rLoop = addrLoop
71f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
7200: 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69  Visit = addrVisi
7210: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73  t;.    pNew->nEs
7220: 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e  t = nEst;.    pN
7230: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ew->zName = sqli
7240: 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64  te3DbStrDup(p->d
7250: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
7260: 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a  ->aScan = aNew;.
7270: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
7280: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7290: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63  value of the opc
72a0: 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20  ode, or P1, P2, 
72b0: 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e  P3, or P5 operan
72c0: 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63  ds.** for a spec
72d0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
72e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72f0: 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
7300: 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  e(Vdbe *p, u32 a
7310: 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f  ddr, u8 iNewOpco
7320: 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  de){.  sqlite3Vd
7330: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
7340: 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70  >opcode = iNewOp
7350: 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  code;.}.void sql
7360: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
7370: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
7380: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
7390: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
73a0: 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76  (p,addr)->p1 = v
73b0: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
73c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
73d0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
73e0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
73f0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
7400: 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c  ,addr)->p2 = val
7410: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
7420: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
7430: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
7440: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
7450: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
7460: 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a  ddr)->p3 = val;.
7470: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7480: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
7490: 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61  *p, u16 p5){.  a
74a0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
74b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
74c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
74d0: 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f  p->nOp>0 ) p->aO
74e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
74f0: 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   p5;.}../*.** Ch
7500: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
7510: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
7520: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
7530: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
7540: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
7550: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
7560: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
7570: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7580: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
7590: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
75a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
75b0: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
75c0: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
75d0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
75e0: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
75f0: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
7600: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
7610: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
7620: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
7630: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
7640: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
7650: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
7660: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
7670: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
7680: 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66  ef){.  if( (pDef
7690: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
76a0: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
76b0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
76c0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
76d0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
76e0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
76f0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
7700: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
7710: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
7720: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
7730: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
7740: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
7750: 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28   void freeP4Mem(
7760: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d  sqlite3 *db, Mem
7770: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
7780: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
7790: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
77a0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74  Malloc);.  sqlit
77b0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
77c0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49  );.}.static SQLI
77d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
77e0: 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73   freeP4FuncCtx(s
77f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
7800: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b  te3_context *p){
7810: 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  .  freeEphemeral
7820: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e  Function(db, p->
7830: 70 46 75 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33  pFunc);. sqlite3
7840: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
7850: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
7860: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
7870: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
7880: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65  oid *p4){.  asse
7890: 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74  rt( db );.  swit
78a0: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
78b0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
78c0: 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50  X: {.      freeP
78d0: 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71  4FuncCtx(db, (sq
78e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70  lite3_context*)p
78f0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7900: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7910: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73  P4_REAL:.    cas
7920: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
7930: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
7940: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e  .    case P4_DYN
7950: 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50  BLOB:.    case P
7960: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
7970: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7980: 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20  e(db, p4);.     
7990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
79a0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
79b0: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64  O: {.      if( d
79c0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
79d0: 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49  =0 ) sqlite3KeyI
79e0: 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66  nfoUnref((KeyInf
79f0: 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72  o*)p4);.      br
7a00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
7a10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7a20: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
7a30: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
7a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7a50: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78  prDelete(db, (Ex
7a60: 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  pr*)p4);.      b
7a70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
7a80: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46  if.    case P4_F
7a90: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
7aa0: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
7ab0: 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44  ction(db, (FuncD
7ac0: 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 62  ef*)p4);.      b
7ad0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7ae0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
7af0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
7b00: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
7b10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7b20: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
7b30: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
7b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7b50: 20 20 20 66 72 65 65 50 34 4d 65 6d 28 64 62 2c     freeP4Mem(db,
7b60: 20 28 4d 65 6d 2a 29 70 34 29 3b 0a 20 20 20 20   (Mem*)p4);.    
7b70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7b80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b90: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
7ba0: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
7bb0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
7bc0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
7bd0: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
7be0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
7c00: 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  e the space allo
7c10: 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e  cated for aOp an
7c20: 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20  d any p4 values 
7c30: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
7c40: 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e  e.** opcodes con
7c50: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49  tained within. I
7c60: 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c  f aOp is not NUL
7c70: 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  L it is assumed 
7c80: 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e  to contain .** n
7c90: 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a  Op entries. .*/.
7ca0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
7cb0: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
7cc0: 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70  te3 *db, Op *aOp
7cd0: 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66  , int nOp){.  if
7ce0: 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20  ( aOp ){.    Op 
7cf0: 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f  *pOp;.    for(pO
7d00: 70 3d 26 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 20 70  p=&aOp[nOp-1]; p
7d10: 4f 70 3e 3d 61 4f 70 3b 20 70 4f 70 2d 2d 29 7b  Op>=aOp; pOp--){
7d20: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
7d30: 70 34 74 79 70 65 20 3c 3d 20 50 34 5f 46 52 45  p4type <= P4_FRE
7d40: 45 5f 49 46 5f 4c 45 20 29 20 66 72 65 65 50 34  E_IF_LE ) freeP4
7d50: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
7d60: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
7d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7d80: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
7d90: 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NTS.      sqlite
7da0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
7db0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
7dc0: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
7dd0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
7de0: 4e 28 64 62 2c 20 61 4f 70 29 3b 0a 20 20 7d 0a  N(db, aOp);.  }.
7df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
7e00: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
7e10: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
7e20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e30: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
7e40: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
7e50: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
7e60: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
7e70: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
7e80: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
7e90: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
7ea0: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
7eb0: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
7ec0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
7ed0: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
7ee0: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
7ef0: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
7f00: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
7f10: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
7f20: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
7f30: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
7f40: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
7f50: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
7f60: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
7f70: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
7f80: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
7f90: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
7fa0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
7fb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
7fc0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  n 0;.  assert( a
7fd0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
7fe0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d  ->nOp );.  pOp =
7ff0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
8000: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
8010: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
8020: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
8030: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
8040: 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a  SED;.  pOp->p4.z
8050: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63   = 0;.  pOp->opc
8060: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
8070: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
8080: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
8090: 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61  opcode is "op" a
80a0: 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a  nd it is not a j
80b0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ump destination,
80c0: 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  .** then remove 
80d0: 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  it.  Return true
80e0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
80f0: 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65  an opcode was re
8100: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
8110: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
8120: 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20  riorOpcode(Vdbe 
8130: 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66  *p, u8 op){.  if
8140: 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d  ( p->nOp>0 && p-
8150: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f  >aOp[p->nOp-1].o
8160: 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20  pcode==op ){.   
8170: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
8180: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
8190: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
81a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
81b0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
81c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
81d0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
81e0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
81f0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
8200: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8210: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
8220: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
8230: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
8240: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
8250: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
8260: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
8270: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
8280: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
8290: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
82a0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
82b0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
82c0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
82d0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
82e0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
82f0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
8300: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
8310: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
8320: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
8330: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
8340: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
8350: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
8360: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
8370: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
8380: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
8390: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
83a0: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20   of zP4..** .** 
83b0: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
83c0: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
83d0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
83e0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
83f0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
8400: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
8410: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
8420: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
8430: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
8440: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
8450: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
8460: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
8470: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
8480: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
8490: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
84a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
84b0: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
84c0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
84d0: 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f  c void SQLITE_NO
84e0: 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67  INLINE vdbeChang
84f0: 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20  eP4Full(.  Vdbe 
8500: 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20  *p,.  Op *pOp,. 
8510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
8520: 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69  ,.  int n.){.  i
8530: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  f( pOp->p4type )
8540: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
8550: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
8560: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
8570: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30   pOp->p4type = 0
8580: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
8590: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
85a0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
85b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
85c0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e   (int)(pOp - p->
85d0: 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  aOp), zP4, n);. 
85e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
85f0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
8600: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
8610: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
8620: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8630: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
8640: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8650: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
8660: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
8670: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
8680: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
8690: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
86a0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
86b0: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
86c0: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
86d0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
86e0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
86f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
8700: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
8710: 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20  sert( p->aOp!=0 
8720: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8730: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
8740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8750: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
8760: 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c  TAB ) freeP4(db,
8770: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
8780: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72  r**)&zP4);.    r
8790: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
87a0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
87b0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
87c0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
87d0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
87e0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
87f0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
8800: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66  >aOp[addr];.  if
8810: 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  ( n>=0 || pOp->p
8820: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62  4type ){.    vdb
8830: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c  eChangeP4Full(p,
8840: 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20   pOp, zP4, n);. 
8850: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8860: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
8870: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
8880: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
8890: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
88a0: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
88b0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
88c0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
88d0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
88e0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
88f0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
8900: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
8910: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
8920: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
8930: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30  }else if( zP4!=0
8940: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8950: 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 );.    pOp->
8960: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
8970: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
8980: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
8990: 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  r)n;.    if( n==
89a0: 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65  P4_VTAB ) sqlite
89b0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
89c0: 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  e*)zP4);.  }.}..
89d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
89e0: 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P4 operand of t
89f0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
8a00: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
8a10: 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  on .** to the va
8a20: 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74  lue defined by t
8a30: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  he arguments.  T
8a40: 68 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70  his is a high-sp
8a50: 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  eed.** version o
8a60: 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  f sqlite3VdbeCha
8a70: 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ngeP4()..**.** T
8a80: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75  he P4 operand mu
8a90: 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  st not have been
8aa0: 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69   previously defi
8ab0: 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65  ned.  And the ne
8ac0: 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74  w.** P4 must not
8ad0: 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55   be P4_INT32.  U
8ae0: 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  se sqlite3VdbeCh
8af0: 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68  angeP4() in eith
8b00: 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63  er of.** those c
8b10: 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ases..*/.void sq
8b20: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8b30: 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20  4(Vdbe *p, void 
8b40: 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *pP4, int n){.  
8b50: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  VdbeOp *pOp;.  a
8b60: 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54  ssert( n!=P4_INT
8b70: 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  32 && n!=P4_VTAB
8b80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c   );.  assert( n<
8b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  =0 );.  if( p->d
8ba0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8bb0: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
8bc0: 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20  >db, n, pP4);.  
8bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8be0: 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20  t( pP4!=0 );.   
8bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
8c00: 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26  0 );.    pOp = &
8c10: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
8c20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
8c30: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
8c40: 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70  TUSED );.    pOp
8c50: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
8c60: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50    pOp->p4.p = pP
8c70: 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  4;.  }.}../*.** 
8c80: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
8c90: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8ca0: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
8cb0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
8cc0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
8cd0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
8ce0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
8cf0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
8d00: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
8d10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8d20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65  rse->pVdbe;.  Ke
8d30: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
8d40: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
8d50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
8d60: 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e  x!=0 );.  pKeyIn
8d70: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
8d80: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
8d90: 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20  e, pIdx);.  if( 
8da0: 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74  pKeyInfo ) sqlit
8db0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
8dc0: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
8dd0: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
8de0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8df0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
8e00: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
8e10: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
8e20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
8e30: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
8e40: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
8e50: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
8e60: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
8e70: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
8e80: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
8e90: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
8ea0: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
8eb0: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
8ec0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
8ed0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
8ee0: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
8ef0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
8f00: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
8f10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
8f20: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
8f30: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
8f40: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
8f50: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
8f60: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
8f70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
8f80: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
8f90: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8fa0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
8fb0: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
8fc0: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
8fd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
8fe0: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
8ff0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
9000: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
9010: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
9020: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
9030: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
9040: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
9050: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
9060: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
9070: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
9080: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
9090: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
90a0: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
90b0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
90c0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
90d0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
90e0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
90f0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
9100: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
9110: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
9120: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
9130: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
9140: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
9150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9160: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
9170: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
9180: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
9190: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
91a0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
91b0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
91c0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
91d0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
91e0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
91f0: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
9200: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
9210: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
9220: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
9230: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
9240: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
9250: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
9260: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
9270: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
9280: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
9290: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
92a0: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
92b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
92c0: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
92d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
92e0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
92f0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
9300: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
9310: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
9320: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9330: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
9340: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
9350: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9360: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
9370: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
9380: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
9390: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
93a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
93b0: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
93c0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
93d0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
93e0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
93f0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
9400: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
9410: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
9420: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
9430: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
9440: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
9450: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
9460: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
9470: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
9480: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
9490: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
94a0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
94b0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
94c0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
94d0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
94e0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
94f0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
9500: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
9510: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
9520: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
9530: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
9540: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
9550: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
9560: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
9570: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
9580: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
9590: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
95a0: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
95b0: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
95c0: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
95d0: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
95e0: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
95f0: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
9600: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
9610: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
9620: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
9630: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
9640: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
9650: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
9660: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
9670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9680: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
9690: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
96a0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
96b0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
96c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
96d0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
96e0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
96f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9700: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
9710: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9720: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
9730: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
9740: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
9750: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
9760: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
9770: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
9780: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
9790: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
97a0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
97b0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
97c0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
97d0: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
97e0: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
97f0: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
9800: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
9810: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
9820: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
9830: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
9840: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
9850: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
9860: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
9870: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
9880: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
9890: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
98a0: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
98b0: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
98c0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
98d0: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
98e0: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
98f0: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
9900: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
9910: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
9920: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
9930: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
9940: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
9950: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
9960: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
9970: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
9980: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
9990: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
99a0: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
99b0: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
99c0: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
99d0: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
99e0: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
99f0: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
9a00: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
9a10: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
9a20: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
9a30: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
9a40: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
9a50: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
9a60: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
9a70: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
9a80: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
9a90: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
9aa0: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
9ab0: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
9ac0: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
9ad0: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
9ae0: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
9af0: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
9b00: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
9b10: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
9b20: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
9b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9b40: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
9b50: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
9b60: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
9b70: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
9b80: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
9b90: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
9ba0: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
9bb0: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
9bc0: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
9bd0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
9be0: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
9bf0: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
9c00: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
9c10: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
9c20: 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b    char zAlt[50];
9c30: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
9c40: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
9c50: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
9c60: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
9c70: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
9c80: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
9c90: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
9ca0: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
9cb0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
9cc0: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
9cd0: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
9ce0: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  me + 1;.    if( 
9cf0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
9d00: 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b  s,"IF ",3)==0 ){
9d10: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
9d20: 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
9d30: 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EP2 ){.        s
9d40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9d50: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9d60: 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73  lt, "r[P2] = (%s
9d70: 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  )", zSynopsis+3)
9d80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9da0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
9db0: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20  Alt), zAlt, "if 
9dc0: 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79  %s goto P2", zSy
9dd0: 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20  nopsis+3);.     
9de0: 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73   }.      zSynops
9df0: 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d  is = zAlt;.    }
9e00: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
9e10: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
9e20: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
9e30: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
9e40: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
9e50: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
9e60: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
9e70: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
9e80: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
9e90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9ea0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
9eb0: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
9ec0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
9ed0: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
9ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9ef0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
9f00: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
9f10: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
9f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
9f30: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
9f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9f50: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
9f60: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
9f70: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
9f80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9f90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
9fa0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
9fb0: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
9fc0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
9fd0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
9fe0: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
a000: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
a010: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
a020: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
a030: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
a040: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
a050: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
a060: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
a070: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
a080: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
a090: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a0a0: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
a0c0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
a0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a0e0: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
a0f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
a100: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
a110: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
a120: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
a130: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a140: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a150: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
a160: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
a170: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
a180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
a190: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
a1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a1b0: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
a1c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a1d0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
a1e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a1f0: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
a200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a210: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
a220: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
a230: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
a240: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a250: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
a260: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
a270: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
a280: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
a290: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a2a0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
a2b0: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
a2c0: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
a2d0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
a2e0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
a2f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
a300: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
a310: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
a320: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
a330: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a340: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
a350: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
a360: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
a370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
a380: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
a390: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a3a0: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
a3b0: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
a3c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
a3d0: 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a  SOR_HINTS)./*.**
a3e0: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50   Translate the P
a3f0: 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f  4.pExpr value fo
a400: 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  r an OP_CursorHi
a410: 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74  nt opcode into t
a420: 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ext.** that can 
a430: 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20  be displayed in 
a440: 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66  the P4 column of
a450: 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e   EXPLAIN output.
a460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a470: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74  displayP4Expr(St
a480: 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20  rAccum *p, Expr 
a490: 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74  *pExpr){.  const
a4a0: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a   char *zOp = 0;.
a4b0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a4c0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
a4d0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
a4e0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a4f0: 65 6e 64 66 28 70 2c 20 22 25 51 22 2c 20 70 45  endf(p, "%Q", pE
a500: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
a510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a520: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
a530: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
a540: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
a550: 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56  %d", pExpr->u.iV
a560: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
a570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a580: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69  NULL:.      sqli
a590: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a5a0: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
a5b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a5c0: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
a5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a5e0: 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72  tr_appendf(p, "r
a5f0: 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54  [%d]", pExpr->iT
a600: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
a610: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a620: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
a630: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a640: 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
a650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
a660: 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 72 6f  r_appendf(p, "ro
a670: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
a680: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a690: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
a6a0: 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70  p, "c%d", (int)p
a6b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
a6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a6d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a6e0: 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20  ase TK_LT:      
a6f0: 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20  zOp = "LT";     
a700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a710: 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70   TK_LE:      zOp
a720: 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72   = "LE";      br
a730: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a740: 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _GT:      zOp = 
a750: 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "GT";      break
a760: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
a770: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45  :      zOp = "GE
a780: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a790: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
a7a0: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20      zOp = "NE"; 
a7b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a7c0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
a7d0: 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20   zOp = "EQ";    
a7e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a7f0: 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f  e TK_IS:      zO
a800: 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62  p = "IS";      b
a810: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a820: 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d  K_ISNOT:   zOp =
a830: 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61   "ISNOT";   brea
a840: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
a850: 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41  ND:     zOp = "A
a860: 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ND";     break;.
a870: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
a880: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b       zOp = "OR";
a890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a8a0: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
a8b0: 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20    zOp = "ADD";  
a8c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a8d0: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a  se TK_STAR:    z
a8e0: 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20  Op = "MUL";     
a8f0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a900: 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20  TK_MINUS:   zOp 
a910: 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65  = "SUB";     bre
a920: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a930: 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  REM:     zOp = "
a940: 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  REM";     break;
a950: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a960: 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  AND:  zOp = "BIT
a970: 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  AND";  break;.  
a980: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
a990: 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22     zOp = "BITOR"
a9a0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a9b0: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20  ase TK_SLASH:   
a9c0: 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20  zOp = "DIV";    
a9d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a9e0: 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70   TK_LSHIFT:  zOp
a9f0: 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72   = "LSHIFT";  br
aa00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
aa10: 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20  _RSHIFT:  zOp = 
aa20: 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b  "RSHIFT";  break
aa30: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
aa40: 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f  NCAT:  zOp = "CO
aa50: 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NCAT";  break;. 
aa60: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
aa70: 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53  S:  zOp = "MINUS
aa80: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
aa90: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20  case TK_UPLUS:  
aaa0: 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20   zOp = "PLUS";  
aab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aac0: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f  e TK_BITNOT:  zO
aad0: 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62  p = "BITNOT";  b
aae0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aaf0: 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d  K_NOT:     zOp =
ab00: 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61   "NOT";     brea
ab10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
ab20: 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49  SNULL:  zOp = "I
ab30: 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a  SNULL";  break;.
ab40: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ab50: 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e  ULL: zOp = "NOTN
ab60: 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
ab70: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
ab80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ab90: 65 6e 64 66 28 70 2c 20 22 25 73 22 2c 20 22 65  endf(p, "%s", "e
aba0: 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65  xpr");.      bre
abb0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a  ak;.  }..  if( z
abc0: 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
abd0: 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c  3_str_appendf(p,
abe0: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
abf0: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
ac00: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
ac10: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
ac20: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
ac30: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ac40: 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a  end(p, ",", 1);.
ac50: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
ac60: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52  xpr(p, pExpr->pR
ac70: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
ac80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
ac90: 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a  end(p, ")", 1);.
aca0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
acb0: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
acc0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
acd0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
ace0: 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20  HINTS) */...#if 
acf0: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a  VDBE_DISPLAY_P4.
ad00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
ad10: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
ad20: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
ad30: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
ad40: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
ad50: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
ad60: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
ad70: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
ad80: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
ad90: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
ada0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
adb0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
adc0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53  zP4 = zTemp;.  S
add0: 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73  trAccum x;.  ass
ade0: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
adf0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ;.  sqlite3StrAc
ae00: 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a  cumInit(&x, 0, z
ae10: 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b  Temp, nTemp, 0);
ae20: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
ae30: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
ae40: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
ae50: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
ae60: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
ae70: 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
ae80: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
ae90: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
aea0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
aeb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aec0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
aed0: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
aee0: 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a 20  o->nKeyField);. 
aef0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
af00: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
af10: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
af20: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
af30: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
af40: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
af50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
af60: 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c  l = pColl ? pCol
af70: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20  l->zName : "";. 
af80: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
af90: 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59  p(zColl, "BINARY
afa0: 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20  ")==0 ) zColl = 
afb0: 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "B";.        sql
afc0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
afd0: 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 0a 20  (&x, ",%s%s", . 
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b                pK
aff0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
b000: 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22  er[j] ? "-" : ""
b010: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
b020: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
b030: 73 74 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22  str_append(&x, "
b040: 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72  )", 1);.      br
b050: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
b060: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b070: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20  CURSOR_HINTS.   
b080: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
b090: 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34  .      displayP4
b0a0: 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34  Expr(&x, pOp->p4
b0b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62  .pExpr);.      b
b0c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b0d0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43  if.    case P4_C
b0e0: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
b0f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
b100: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b120: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 28  r_appendf(&x, "(
b130: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
b140: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
b150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b160: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
b170: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
b180: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
b190: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
b1a0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b1b0: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70  (&x, "%s(%d)", p
b1c0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
b1d0: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20  reak;.    }.#if 
b1f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
b200: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
b210: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
b220: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
b230: 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  TX: {.      Func
b240: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
b250: 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b  >p4.pCtx->pFunc;
b260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
b270: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
b280: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
b290: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
b2a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b2b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b2c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
b2d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b2e0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b2f0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
b300: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
b310: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b320: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
b330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b340: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b350: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
b360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b370: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
b380: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
b390: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
b3a0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  (&x, "%.16g", *p
b3b0: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
b3c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
b3e0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
b3f0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
b400: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
b410: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
b420: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
b430: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
b440: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b450: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
b460: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
b470: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b480: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
b490: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
b4a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
b4b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
b4c0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
b4d0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b4e0: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70  f(&x, "%.16g", p
b4f0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
b500: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
b510: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
b520: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  l ){.        zP4
b530: 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20   = "NULL";.     
b540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b550: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
b560: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
b570: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
b580: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
b590: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b5a0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b5b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
b5c0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
b5d0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
b5e0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
b5f0: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
b600: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
b610: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
b620: 70 65 6e 64 66 28 26 78 2c 20 22 76 74 61 62 3a  pendf(&x, "vtab:
b630: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
b640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b650: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
b660: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
b670: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b680: 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d    int *ai = pOp-
b690: 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e  >p4.ai;.      in
b6a0: 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f  t n = ai[0];   /
b6b0: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
b6c0: 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52  ent of an INTARR
b6d0: 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  AY is always the
b6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b6f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74          ** count
b700: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b710: 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f  f elements to fo
b720: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f  llow */.      fo
b730: 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b  r(i=1; i<=n; i++
b740: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b750: 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
b760: 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29  x, ",%d", ai[i])
b770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b780: 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a  zTemp[0] = '[';.
b790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b7a0: 72 5f 61 70 70 65 6e 64 28 26 78 2c 20 22 5d 22  r_append(&x, "]"
b7b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
b7c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b7d0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a  e P4_SUBPROGRAM:
b7e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b7f0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
b800: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
b810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b820: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 42      case P4_DYNB
b830: 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 50 34  LOB:.    case P4
b840: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
b850: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
b860: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b870: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54   }.    case P4_T
b880: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
b890: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b8a0: 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d  f(&x, "%s", pOp-
b8b0: 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  >p4.pTab->zName)
b8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b8d0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
b8e0: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
b8f0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
b900: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
b910: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
b920: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
b930: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
b940: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
b950: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
b960: 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72  ish(&x);.  asser
b970: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
b980: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
b990: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
b9a0: 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LAY_P4 */../*.**
b9b0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
b9c0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
b9d0: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
b9e0: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
b9f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
ba00: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
ba10: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
ba20: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
ba30: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
ba40: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
ba50: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
ba60: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
ba70: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
ba80: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
ba90: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
baa0: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
bab0: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
bac0: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
bad0: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
bae0: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
baf0: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
bb00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bb10: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
bb20: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
bb30: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
bb40: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
bb50: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
bb60: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
bb70: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
bb80: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
bb90: 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53  )*8 );.  DbMaskS
bba0: 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  et(p->btreeMask,
bbb0: 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20   i);.  if( i!=1 
bbc0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  && sqlite3BtreeS
bbd0: 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61  harable(p->db->a
bbe0: 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20  Db[i].pBt) ){.  
bbf0: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c    DbMaskSet(p->l
bc00: 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d  ockMask, i);.  }
bc10: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
bc20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
bc30: 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a  RED_CACHE)./*.**
bc40: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
bc50: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
bc60: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
bc70: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
bc80: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
bc90: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
bca0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
bcb0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
bcc0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
bcd0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
bce0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
bcf0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
bd00: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
bd10: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
bd20: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
bd30: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
bd40: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
bd50: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
bd60: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
bd70: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
bd80: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
bd90: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
bda0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
bdb0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
bdc0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
bdd0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
bde0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
bdf0: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
be00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
be10: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
be20: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
be30: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
be40: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
be50: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
be60: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
be70: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
be80: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
be90: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
bea0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
beb0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
bec0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
bed0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
bee0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
bef0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
bf00: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
bf10: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
bf20: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
bf30: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
bf40: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
bf50: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
bf60: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
bf70: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
bf80: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
bf90: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
bfa0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
bfb0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
bfc0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
bfd0: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
bfe0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
bff0: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
c000: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
c010: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
c020: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
c030: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
c040: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
c050: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
c060: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
c070: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
c080: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
c090: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
c0a0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
c0b0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
c0c0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
c0d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
c0e0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
c0f0: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
c100: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
c110: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
c120: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
c130: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
c140: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
c150: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
c160: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c170: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
c180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
c190: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
c1a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
c1b0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
c1c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
c1d0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
c1e0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
c1f0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
c200: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
c210: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
c220: 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  r()..*/.static S
c230: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
c240: 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64  oid vdbeLeave(Vd
c250: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
c260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c270: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
c280: 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   nDb;.  db = p->
c290: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
c2a0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
c2b0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
c2c0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
c2d0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
c2e0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
c2f0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
c300: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
c310: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c320: 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b  3BtreeLeave(aDb[
c330: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
c340: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
c350: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20  3VdbeLeave(Vdbe 
c360: 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73  *p){.  if( DbMas
c370: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
c380: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
c390: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
c3a0: 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61  ase */.  vdbeLea
c3b0: 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ve(p);.}.#endif.
c3c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
c3d0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
c3e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
c3f0: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
c400: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
c410: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
c420: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
c430: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
c440: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
c450: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
c460: 2c 20 69 6e 74 20 70 63 2c 20 56 64 62 65 4f 70  , int pc, VdbeOp
c470: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
c480: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
c490: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
c4a0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
c4b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
c4c0: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
c4d0: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
c4e0: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
c4f0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
c500: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
c510: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
c520: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
c530: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
c540: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c550: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
c560: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
c570: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
c580: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
c590: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
c5a0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
c5b0: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69  /* NB:  The sqli
c5c0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20  te3OpcodeName() 
c5d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
c5e0: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20  emented by code 
c5f0: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20  created.  ** by 
c600: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
c610: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e  k and mkopcodec.
c620: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63  awk scripts whic
c630: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  h extract the.  
c640: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
c650: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73  rom the vdbe.c s
c660: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20  ource text */.  
c670: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
c680: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
c690: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
c6a0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
c6b0: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
c6c0: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
c6d0: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20  4, pOp->p5,.    
c6e0: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66    zCom.  );.  ff
c6f0: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
c700: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  ndif../*.** Init
c710: 69 61 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20  ialize an array 
c720: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
c730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c740: 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65   initMemArray(Me
c750: 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c  m *p, int N, sql
c760: 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c  ite3 *db, u16 fl
c770: 61 67 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28  ags){.  while( (
c780: 4e 2d 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d  N--)>0 ){.    p-
c790: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
c7a0: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
c7b0: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
c7c0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
c7d0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e  TE_DEBUG.    p->
c7e0: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
c7f0: 23 65 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a  #endif.    p++;.
c800: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
c810: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
c820: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
c830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
c840: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
c850: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
c860: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
c870: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26     Mem *pEnd = &
c880: 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  p[N];.    sqlite
c890: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
c8a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
c8b0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
c8c0: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
c8d0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
c8e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c8f0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
c900: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
c910: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
c920: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
c930: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
c940: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
c950: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
c960: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
c970: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
c980: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
c990: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
c9a0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
c9b0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
c9c0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
c9d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
c9e0: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
c9f0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
ca00: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
ca10: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
ca20: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
ca30: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
ca40: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
ca50: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
ca60: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
ca70: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
ca80: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
ca90: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
caa0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
cab0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
cac0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
cad0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
cae0: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
caf0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
cb00: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
cb10: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
cb20: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
cb30: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
cb40: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
cb50: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
cb60: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
cb70: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
cb80: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
cb90: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
cba0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
cbb0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
cbc0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
cbd0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
cbe0: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
cbf0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
cc00: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
cc10: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
cc20: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
cc30: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
cc40: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
cc50: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
cc60: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
cc70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
cc80: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
cc90: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
cca0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
ccb0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
ccc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccd0: 70 2d 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33  p->xDel==sqlite3
cce0: 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 20  VdbeFrameMemDel 
ccf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
cd00: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
cd10: 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20  EM_Dyn) ){.     
cd20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
cd30: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
cd40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
cd50: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
cd60: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
cd70: 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  eNN(db, p->zMall
cd80: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
cd90: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
cda0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
cdb0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
cdc0: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
cdd0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
cde0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53  .  }.}..#ifdef S
cdf0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
ce00: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 70 46  * Verify that pF
ce10: 72 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20  rame is a valid 
ce20: 56 64 62 65 46 72 61 6d 65 20 70 6f 69 6e 74 65  VdbeFrame pointe
ce30: 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  r.  Return true 
ce40: 69 66 20 69 74 20 69 73 0a 2a 2a 20 61 6e 64 20  if it is.** and 
ce50: 66 61 6c 73 65 20 69 66 20 73 6f 6d 65 74 68 69  false if somethi
ce60: 6e 67 20 69 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a  ng is wrong..**.
ce70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ce80: 69 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  is intended for 
ce90: 75 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73  use inside of as
cea0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
ceb0: 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  s only..*/.int s
cec0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
ced0: 73 56 61 6c 69 64 28 56 64 62 65 46 72 61 6d 65  sValid(VdbeFrame
cee0: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 69 66 28   *pFrame){.  if(
cef0: 20 70 46 72 61 6d 65 2d 3e 69 46 72 61 6d 65 4d   pFrame->iFrameM
cf00: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 46 52 41  agic!=SQLITE_FRA
cf10: 4d 45 5f 4d 41 47 49 43 20 29 20 72 65 74 75 72  ME_MAGIC ) retur
cf20: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
cf30: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
cf40: 2a 20 54 68 69 73 20 69 73 20 61 20 64 65 73 74  * This is a dest
cf50: 72 75 63 74 6f 72 20 6f 6e 20 61 20 4d 65 6d 20  ructor on a Mem 
cf60: 6f 62 6a 65 63 74 20 28 77 68 69 63 68 20 69 73  object (which is
cf70: 20 72 65 61 6c 6c 79 20 61 6e 20 73 71 6c 69 74   really an sqlit
cf80: 65 33 5f 76 61 6c 75 65 29 0a 2a 2a 20 74 68 61  e3_value).** tha
cf90: 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 46 72  t deletes the Fr
cfa0: 61 6d 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  ame object that 
cfb0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  is attached to i
cfc0: 74 20 61 73 20 61 20 62 6c 6f 62 2e 0a 2a 2a 0a  t as a blob..**.
cfd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cfe0: 64 6f 65 73 20 6e 6f 74 20 64 65 6c 65 74 65 20  does not delete 
cff0: 74 68 65 20 46 72 61 6d 65 20 72 69 67 68 74 20  the Frame right 
d000: 61 77 61 79 2e 20 20 49 74 20 6d 65 72 65 6c 79  away.  It merely
d010: 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 66 72 61   adds the.** fra
d020: 6d 65 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20  me to a list of 
d030: 66 72 61 6d 65 73 20 74 6f 20 62 65 20 64 65 6c  frames to be del
d040: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  eted when the Vd
d050: 62 65 20 68 61 6c 74 73 2e 0a 2a 2f 0a 76 6f 69  be halts..*/.voi
d060: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
d070: 6d 65 4d 65 6d 44 65 6c 28 76 6f 69 64 20 2a 70  meMemDel(void *p
d080: 41 72 67 29 7b 0a 20 20 56 64 62 65 46 72 61 6d  Arg){.  VdbeFram
d090: 65 20 2a 70 46 72 61 6d 65 20 3d 20 28 56 64 62  e *pFrame = (Vdb
d0a0: 65 46 72 61 6d 65 2a 29 70 41 72 67 3b 0a 20 20  eFrame*)pArg;.  
d0b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
d0c0: 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28  dbeFrameIsValid(
d0d0: 70 46 72 61 6d 65 29 20 29 3b 0a 20 20 70 46 72  pFrame) );.  pFr
d0e0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70  ame->pParent = p
d0f0: 46 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72  Frame->v->pDelFr
d100: 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 76  ame;.  pFrame->v
d110: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 46  ->pDelFrame = pF
d120: 72 61 6d 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rame;.}.../*.** 
d130: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
d140: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
d150: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
d160: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
d170: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
d180: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
d190: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
d1a0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
d1b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d1c0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
d1d0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
d1e0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
d1f0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
d200: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
d210: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
d220: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
d230: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
d240: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d250: 56 64 62 65 46 72 61 6d 65 49 73 56 61 6c 69 64  VdbeFrameIsValid
d260: 28 70 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  (p) );.  for(i=0
d270: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
d280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
d290: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
d2a0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
d2b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
d2c0: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
d2d0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
d2e0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d2f0: 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64  eAuxData(p->v->d
d300: 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
d310: 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   -1, 0);.  sqlit
d320: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
d330: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
d340: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d350: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
d360: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
d370: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
d380: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d390: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
d3a0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
d3b0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
d3c0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
d3d0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
d3e0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
d3f0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
d400: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
d410: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
d420: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
d430: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
d440: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
d450: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
d460: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
d470: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
d480: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
d490: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
d4a0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
d4b0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
d4c0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
d4d0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
d4e0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
d4f0: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
d500: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
d510: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
d520: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
d530: 2a 20 32 30 31 38 2d 30 34 2d 32 34 3a 20 20 49  * 2018-04-24:  I
d540: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  n p->explain==2 
d550: 6d 6f 64 65 2c 20 74 68 65 20 4f 50 5f 49 6e 69  mode, the OP_Ini
d560: 74 20 6f 70 63 6f 64 65 73 20 6f 66 20 74 72 69  t opcodes of tri
d570: 67 67 65 72 73 0a 2a 2a 20 61 72 65 20 61 6c 73  ggers.** are als
d580: 6f 20 73 68 6f 77 6e 2c 20 73 6f 20 74 68 61 74  o shown, so that
d590: 20 74 68 65 20 62 6f 75 6e 64 61 72 69 65 73 20   the boundaries 
d5a0: 62 65 74 77 65 65 6e 20 74 68 65 20 6d 61 69 6e  between the main
d5b0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 0a 2a 2a 20   program and.** 
d5c0: 65 61 63 68 20 74 72 69 67 67 65 72 20 61 72 65  each trigger are
d5d0: 20 63 6c 65 61 72 2e 0a 2a 2a 0a 2a 2a 20 57 68   clear..**.** Wh
d5e0: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
d5f0: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
d600: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
d610: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
d620: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
d630: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
d640: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
d650: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d660: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
d670: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
d680: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
d690: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
d6a0: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
d6d0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
d6e0: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
d6f0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d710: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
d720: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
d730: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
d740: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
d750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d760: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
d770: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
d780: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
d7a0: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
d7b0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
d7c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d7d0: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
d7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d7f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d800: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
d810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d840: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
d850: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d870: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
d880: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
d890: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
d8a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
d8b0: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
d8c0: 0a 20 20 69 6e 74 20 62 4c 69 73 74 53 75 62 70  .  int bListSubp
d8d0: 72 6f 67 73 20 3d 20 28 70 2d 3e 65 78 70 6c 61  rogs = (p->expla
d8e0: 69 6e 3d 3d 31 20 7c 7c 20 28 64 62 2d 3e 66 6c  in==1 || (db->fl
d8f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54 72 69  ags & SQLITE_Tri
d900: 67 67 65 72 45 51 50 29 21 3d 30 29 3b 0a 20 20  ggerEQP)!=0);.  
d910: 4f 70 20 2a 70 4f 70 20 3d 20 30 3b 0a 0a 20 20  Op *pOp = 0;..  
d920: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
d930: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
d940: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
d950: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
d960: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
d970: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
d980: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
d990: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
d9a0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
d9b0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
d9c0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
d9d0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
d9e0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
d9f0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
da00: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
da10: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
da20: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
da30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
da40: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
da50: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
da60: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
da70: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
da80: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
da90: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
daa0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
dab0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
dac0: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
dad0: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
dae0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
daf0: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
db00: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
db10: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
db20: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
db30: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
db40: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
db50: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
db60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
db70: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
db80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
db90: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
dba0: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
dbb0: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
dbc0: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
dbd0: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
dbe0: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
dbf0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
dc00: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
dc10: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
dc20: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
dc30: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
dc40: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
dc50: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
dc60: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
dc70: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
dc80: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
dc90: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
dca0: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
dcb0: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
dcc0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
dcd0: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
dce0: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
dcf0: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
dd00: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
dd10: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
dd20: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
dd30: 20 62 4c 69 73 74 53 75 62 70 72 6f 67 73 20 29   bListSubprogs )
dd40: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
dd50: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
dd60: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
dd70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
dd80: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
dd90: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
dda0: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
ddb0: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
ddc0: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
ddd0: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
dde0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
ddf0: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
de00: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
de10: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
de20: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
de30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
de40: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
de50: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
de60: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
de70: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
de80: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
de90: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
dea0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
deb0: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
dec0: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
ded0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
dee0: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
def0: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
df00: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
df10: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
df20: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
df30: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
df40: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
df50: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
df60: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
df70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
df80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
df90: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
dfa0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
dfb0: 20 77 68 69 6c 65 28 31 29 7b 20 20 2f 2a 20 4c   while(1){  /* L
dfc0: 6f 6f 70 20 65 78 69 74 73 20 76 69 61 20 62 72  oop exits via br
dfd0: 65 61 6b 20 2a 2f 0a 20 20 20 20 69 20 3d 20 70  eak */.    i = p
dfe0: 2d 3e 70 63 2b 2b 3b 0a 20 20 20 20 69 66 28 20  ->pc++;.    if( 
dff0: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 20  i>=nRow ){.     
e000: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e010: 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  OK;.      rc = S
e020: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
e030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e040: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
e050: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
e060: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
e070: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
e080: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
e090: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
e0a0: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
e0b0: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
e0c0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
e0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
e0e0: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
e0f0: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
e100: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
e110: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
e120: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
e130: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
e140: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
e150: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
e160: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
e170: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
e180: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
e190: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
e1a0: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
e1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e1c0: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
e1d0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20  aOp[i];.    }.. 
e1e0: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
e1f0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
e200: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
e210: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
e220: 61 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 61 20  at has.    ** a 
e230: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
e240: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
e250: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e260: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
e270: 72 61 6d 73 0a 20 20 20 20 2a 2a 20 6b 65 70 74  rams.    ** kept
e280: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
e290: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
e2a0: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
e2b0: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
e2c0: 72 61 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ram.    ** has n
e2d0: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
e2e0: 73 65 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  seen..    */.   
e2f0: 20 69 66 28 20 62 4c 69 73 74 53 75 62 70 72 6f   if( bListSubpro
e300: 67 73 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70  gs && pOp->p4typ
e310: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
e320: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
e330: 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73  yte = (nSub+1)*s
e340: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
e350: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
e360: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e370: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
e380: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
e390: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
e3a0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
e3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e3c0: 6a 3d 3d 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  j==nSub ){.     
e3d0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
e3e0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
e3f0: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
e400: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
e410: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
e420: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
e430: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e440: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e450: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e460: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
e470: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
e480: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 61 70 53  ->z;.        apS
e490: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
e4a0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
e4b0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
e4c0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
e4d0: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
e4e0: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
e4f0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
e500: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 70 4f 70 2d      nRow += pOp-
e510: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f  >p4.pProgram->nO
e520: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
e530: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
e540: 61 69 6e 3c 32 20 29 20 62 72 65 61 6b 3b 0a 20  ain<2 ) break;. 
e550: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
e560: 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
e570: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
e580: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
e590: 49 6e 69 74 20 26 26 20 70 2d 3e 70 63 3e 31 20  Init && p->pc>1 
e5a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
e5b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e5c0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  K ){.    if( db-
e5d0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
e5e0: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  d ){.      p->rc
e5f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
e600: 55 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  UPT;.      rc = 
e610: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
e630: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
e640: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
e650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e660: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 20  char *zP4;.     
e670: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
e680: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =1 ){.        pM
e690: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e6a0: 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  Int;.        pMe
e6b0: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
e6e0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
e6f0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
e700: 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20 70 4d  .    .        pM
e710: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e720: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
e730: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
e740: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
e750: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
e760: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
e770: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
e780: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e790: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
e7a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
e7b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
e7c0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  Mem->z);.       
e7d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
e7e0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
e7f0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20    pMem++;.      
e800: 7d 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  }..      pMem->f
e810: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e820: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e830: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
e860: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
e870: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e880: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
e890: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
e8a0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8c0: 50 32 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P2 */.      pMem
e8d0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ++;..      pMem-
e8e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e8f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
e900: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
e930: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
e940: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
e950: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
e960: 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20  size(pMem, 100) 
e970: 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20  ){ /* P4 */.    
e980: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
e990: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e9a0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e9b0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
e9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
e9d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
e9e0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
e9f0: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
ea00: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
ea10: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  , pMem->szMalloc
ea20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  );.      if( zP4
ea30: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
ea40: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30       pMem->n = 0
ea50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ea60: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
ea70: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
ea80: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
ea90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eaa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
eab0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
eac0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
ead0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
eae0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  ->z);.        pM
eaf0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
eb00: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 7d 0a 20  _UTF8;.      }. 
eb10: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
eb20: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
eb30: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  in==1 ){.       
eb40: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
eb50: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
eb60: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
eb70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eb80: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
eb90: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
eba0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ebb0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
ebc0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
ebd0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
ebe0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
ebf0: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
ec00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
ec10: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
ec20: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
ec30: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
ec40: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
ec50: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ec60: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
ec70: 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
ec80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
ec90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
eca0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
ecb0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
ecc0: 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29  ize(pMem, 500) )
ecd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
ece0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ecf0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ed00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ed10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ed20: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65 6d    }.        pMem
ed30: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
ed40: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
ed50: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
ed60: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
ed70: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
ed80: 35 30 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  500);.        pM
ed90: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
eda0: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
edb0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
edc0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
edf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
ee00: 0a 20 20 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  .      p->nResCo
ee10: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
ee20: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
ee30: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
ee40: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
ee50: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
ee60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
ee70: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
ee80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ee90: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
eea0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
eeb0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
eec0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
eed0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
eee0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
eef0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
ef00: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
ef10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ef20: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
ef30: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
ef40: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
ef50: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
ef60: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
ef70: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
ef80: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
ef90: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
efa0: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
efb0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
efc0: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
efd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
efe0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
eff0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
f000: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
f010: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
f020: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
f030: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
f040: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
f050: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f060: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
f070: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
f080: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
f090: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
f0a0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
f0b0: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
f0c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f0d0: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
f0e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
f0f0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
f100: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
f110: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
f120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f130: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
f140: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
f150: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
f160: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
f170: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
f180: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
f190: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
f1a0: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
f1b0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
f1c0: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
f1d0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
f1e0: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
f1f0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
f200: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
f210: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
f220: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
f230: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
f240: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
f250: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
f260: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
f270: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
f280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f290: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
f2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f2b0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
f2c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
f2d0: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
f2e0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
f2f0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
f300: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
f310: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
f320: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
f330: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65  f this object de
f340: 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d  scribes bulk mem
f350: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
f360: 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63  r use.** by subc
f370: 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70  omponents of a p
f380: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
f390: 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c  t.  Space is all
f3a0: 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66  ocated out.** of
f3b0: 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65   a ReusableSpace
f3c0: 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61   object by the a
f3d0: 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74  llocSpace() rout
f3e0: 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74  ine below..*/.st
f3f0: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
f400: 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63  ce {.  u8 *pSpac
f410: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  e;          /* A
f420: 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20  vailable memory 
f430: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
f440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
f450: 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
f460: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
f470: 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20 20  nNeeded;        
f480: 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20   /* Total bytes 
f490: 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  that could not b
f4a0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d  e allocated */.}
f4b0: 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c  ;../* Try to all
f4c0: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
f4d0: 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  s of 8-byte alig
f4e0: 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  ned bulk memory 
f4f0: 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d  for pBuf.** from
f500: 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
f510: 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75  ce object.  Retu
f520: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
f530: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  the allocated.**
f540: 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65   memory on succe
f550: 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63  ss.  If insuffic
f560: 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61  ient memory is a
f570: 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a  vailable in the.
f580: 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ** ReusableSpace
f590: 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73   object, increas
f5a0: 65 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70  e the ReusableSp
f5b0: 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76  ace.nNeeded.** v
f5c0: 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75  alue by the amou
f5d0: 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65  nt needed and re
f5e0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
f5f0: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20   If pBuf is not 
f600: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
f610: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
f620: 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61  the memory has a
f630: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61  lready.** been a
f640: 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72  llocated by a pr
f650: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ior call to this
f660: 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73   routine, so jus
f670: 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a  t return a copy.
f680: 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c  ** of pBuf and l
f690: 65 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61  eave ReusableSpa
f6a0: 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ce unchanged..**
f6b0: 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74  .** This allocat
f6c0: 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74  or is employed t
f6d0: 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73  o repurpose unus
f6e0: 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20  ed slots at the 
f6f0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70  end of the.** op
f700: 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72  code array of pr
f710: 65 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72  epared state for
f720: 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65   other memory ne
f730: 65 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61  eds of the prepa
f740: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
f750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f760: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
f770: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
f780: 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c  pace *p,  /* Bul
f790: 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  k memory availab
f7a0: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
f7b0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
f7c0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
f7d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
f7e0: 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f   prior allocatio
f7f0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
f820: 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b  ory needed */.){
f830: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
f840: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
f850: 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  p->pSpace) );.  
f860: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
f870: 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
f880: 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  8(nByte);.    if
f890: 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46  ( nByte <= p->nF
f8a0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ree ){.      p->
f8b0: 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a  nFree -= nByte;.
f8c0: 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d        pBuf = &p-
f8d0: 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65  >pSpace[p->nFree
f8e0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
f8f0: 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b      p->nNeeded +
f900: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20  = nByte;.    }. 
f910: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
f920: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
f930: 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74  T(pBuf) );.  ret
f940: 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn pBuf;.}../*.
f950: 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44  ** Rewind the VD
f960: 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  BE back to the b
f970: 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70  eginning in prep
f980: 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72  aration for.** r
f990: 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f  unning it..*/.vo
f9a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
f9b0: 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23  wind(Vdbe *p){.#
f9c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
f9d0: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
f9e0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
f9f0: 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69  ).  int i;.#endi
fa00: 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  f.  assert( p!=0
fa10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
fa20: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
fa30: 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61  IC_INIT || p->ma
fa40: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
fa50: 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  RESET );..  /* T
fa60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
fa70: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
fa80: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
fa90: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
faa0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
fab0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
fac0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
fad0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
fae0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
faf0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
fb00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
fb10: 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  BUG.  for(i=0; i
fb20: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
fb30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
fb40: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
fb50: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
fb60: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
fb70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
fb80: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
fb90: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
fba0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
fbb0: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
fbc0: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
fbd0: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
fbe0: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
fbf0: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
fc00: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
fc10: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
fc20: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
fc30: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
fc40: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
fc50: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
fc60: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
fc70: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
fc80: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
fc90: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
fca0: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
fcb0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
fcc0: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
fcd0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
fce0: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
fcf0: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
fd00: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
fd10: 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  g registers and 
fd20: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
fd30: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
fd40: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
fd50: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
fd60: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
fd70: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
fd80: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
fd90: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
fda0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
fdb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
fdc0: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
fdd0: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
fde0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
fdf0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
fe00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
fe10: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
fe20: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
fe30: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
fe40: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
fe50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
fe60: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
fe70: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
fe80: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
fe90: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
fea0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
feb0: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
fec0: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
fed0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
fee0: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
fef0: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
ff00: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
ff10: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
ff20: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
ff30: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
ff40: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
ff50: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
ff60: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
ff70: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
ff80: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
ff90: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
ffa0: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
ffb0: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
ffc0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
ffd0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
ffe0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
fff0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
10020 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
10030 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
10040 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10050 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
10060 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10080 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
10090 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
100a0 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
100b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
100c0 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
100d0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
100e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
100f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10100 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
10110 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
10120 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10140 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
10150 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
10160 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10180 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
10190 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
101a0 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  rams */.  int n;
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
101d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74   counter */.  st
101e0 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61  ruct ReusableSpa
101f0 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ce x;        /* 
10200 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65  Reusable bulk me
10210 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72  mory */..  asser
10220 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
10230 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
10240 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
10250 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
10260 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
10270 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
10280 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
10290 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
102a0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
102b0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
102c0 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
102d0 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
102e0 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
102f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
10300 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
10310 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
10320 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
10330 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72 73   .  /* Each curs
10340 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72 79  or uses a memory
10350 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72 73   cell.  The firs
10360 74 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f 72  t cursor (cursor
10370 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73 65   0) can.  ** use
10380 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20 69   aMem[0] which i
10390 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
103a0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
103b0 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f 63   program.  Alloc
103c0 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 61  ate.  ** space a
103d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d 65  t the end of aMe
103e0 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73 20  m[] for cursors 
103f0 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a 20  1 and greater.. 
10400 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
10410 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
10420 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
10430 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e 43  Cursor;.  if( nC
10440 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65 6d  ursor==0 && nMem
10450 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a  >0 ) nMem++;  /*
10460 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d 5b   Space for aMem[
10470 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20 75  0] even if not u
10480 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  sed */..  /* Fig
10490 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
104a0 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72 79   reusable memory
104b0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74   is available at
104c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
104d0 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61    ** opcode arra
104e0 79 2e 20 20 54 68 69 73 20 65 78 74 72 61 20 6d  y.  This extra m
104f0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72 65  emory will be re
10500 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f 74  allocated for ot
10510 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a  her elements.  *
10520 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65  * of the prepare
10530 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
10540 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28 73  /.  n = ROUND8(s
10550 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70  izeof(Op)*p->nOp
10560 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
10570 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63 6f  /* Bytes of opco
10580 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 2a  de memory used *
10590 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20 26  /.  x.pSpace = &
105a0 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d  ((u8*)p->aOp)[n]
105b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
105c0 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64 65  /* Unused opcode
105d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
105e0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
105f0 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70 61  ALIGNMENT(x.pSpa
10600 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65 65  ce) );.  x.nFree
10610 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50   = ROUNDDOWN8(pP
10620 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20  arse->szOpAlloc 
10630 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73 20  - n);  /* Bytes 
10640 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  of unused memory
10650 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78 2e   */.  assert( x.
10660 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61 73  nFree>=0 );.  as
10670 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
10680 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53  _ALIGNMENT(&x.pS
10690 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29  pace[x.nFree]) )
106a0 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
106b0 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
106c0 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
106d0 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
106e0 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
106f0 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
10700 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
10710 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
10720 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
10730 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
10740 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
10750 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
10760 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
10770 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
10780 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
10790 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  d in one or two.
107a0 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
107b0 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
107c0 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
107d0 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61   unused memory a
107e0 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
107f0 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
10800 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
10810 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
10820 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
10830 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
10840 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
10850 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
10860 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
10870 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
10880 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61  fill in the rema
10890 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72  inder using a fr
108a0 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  esh memory alloc
108b0 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
108c0 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
108d0 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
108e0 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
108f0 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
10900 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
10910 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61  eftover memory a
10920 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10930 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
10940 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69  This can signifi
10950 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75  cantly.  ** redu
10960 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
10970 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
10980 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
10990 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e  ment..  */.  x.n
109a0 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 70 2d  Needed = 0;.  p-
109b0 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
109c0 63 65 28 26 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73  ce(&x, 0, nMem*s
109d0 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70  izeof(Mem));.  p
109e0 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
109f0 61 63 65 28 26 78 2c 20 30 2c 20 6e 56 61 72 2a  ace(&x, 0, nVar*
10a00 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
10a10 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
10a20 53 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 41 72  Space(&x, 0, nAr
10a30 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b  g*sizeof(Mem*));
10a40 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c  .  p->apCsr = al
10a50 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20  locSpace(&x, 0, 
10a60 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
10a70 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
10a80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10a90 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
10aa0 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d  US.  p->anExec =
10ab0 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
10ac0 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  0, p->nOp*sizeof
10ad0 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
10ae0 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 20 29   if( x.nNeeded )
10af0 7b 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d  {.    x.pSpace =
10b00 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
10b10 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
10b20 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b  (db, x.nNeeded);
10b30 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78  .    x.nFree = x
10b40 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 20 20 69 66  .nNeeded;.    if
10b50 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
10b60 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  led ){.      p->
10b70 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
10b80 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e  e(&x, p->aMem, n
10b90 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
10ba0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20  ;.      p->aVar 
10bb0 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
10bc0 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73   p->aVar, nVar*s
10bd0 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20  izeof(Mem));.   
10be0 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c     p->apArg = al
10bf0 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
10c00 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
10c10 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 20  of(Mem*));.     
10c20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
10c30 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70  cSpace(&x, p->ap
10c40 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
10c50 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
10c60 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
10c70 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
10c80 4e 53 54 41 54 55 53 0a 20 20 20 20 20 20 70 2d  NSTATUS.      p-
10c90 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
10ca0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78  pace(&x, p->anEx
10cb0 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
10cc0 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
10cd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
10ce0 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d  pVList = pParse-
10cf0 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73  >pVList;.  pPars
10d00 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a  e->pVList =  0;.
10d10 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
10d20 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
10d30 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10d40 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
10d50 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70  >nVar = 0;.    p
10d60 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->nCursor = 0;. 
10d70 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a     p->nMem = 0;.
10d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
10d90 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
10da0 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  r;.    p->nVar =
10db0 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
10dc0 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70    initMemArray(p
10dd0 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62  ->aVar, nVar, db
10de0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
10df0 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
10e00 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
10e10 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c  y(p->aMem, nMem,
10e20 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e   db, MEM_Undefin
10e30 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ed);.    memset(
10e40 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75  p->apCsr, 0, nCu
10e50 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
10e60 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
10e70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10e80 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
10e90 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e      memset(p->an
10ea0 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  Exec, 0, p->nOp*
10eb0 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
10ec0 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
10ed0 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
10ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10ef0 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
10f00 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
10f10 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
10f20 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
10f30 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
10f40 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10f50 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
10f60 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
10f70 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
10f80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10f90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10fa0 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20  pCx->pBtx==0 || 
10fb0 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
10fc0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
10fd0 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65    switch( pCx->e
10fe0 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63  CurType ){.    c
10ff0 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54  ase CURTYPE_SORT
11000 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
11010 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
11020 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
11030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11040 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54   }.    case CURT
11050 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20  YPE_BTREE: {.   
11060 20 20 20 69 66 28 20 70 43 78 2d 3e 69 73 45 70     if( pCx->isEp
11070 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 20  hemeral ){.     
11080 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78     if( pCx->pBtx
11090 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   ) sqlite3BtreeC
110a0 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 78 29 3b  lose(pCx->pBtx);
110b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
110c0 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
110d0 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
110e0 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
110f0 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20  exists, by.     
11100 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
11110 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  bove. */.      }
11120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
11130 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43  sert( pCx->uc.pC
11140 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
11150 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11160 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
11170 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
11180 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11190 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
111a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
111b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
111c0 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a  se CURTYPE_VTAB:
111d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
111e0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
111f0 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56  Cur = pCx->uc.pV
11200 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Cur;.      const
11210 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
11220 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72  *pModule = pVCur
11230 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
11240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11250 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
11260 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56  ef>0 );.      pV
11270 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
11280 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c  --;.      pModul
11290 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
112a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
112b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
112c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
112d0 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ll cursors in th
112e0 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
112f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11300 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
11310 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ame(Vdbe *p){.  
11320 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
11330 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
11340 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
11350 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
11360 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
11370 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
11380 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
11390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
113a0 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
113b0 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
113c0 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
113d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
113e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
113f0 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
11400 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
11410 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
11420 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
11430 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
11440 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
11450 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
11460 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
11470 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
11480 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
11490 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
114a0 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
114b0 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
114c0 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
114d0 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
114e0 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
114f0 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65  nFrame(v);.#ifde
11500 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11510 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
11520 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46    v->anExec = pF
11530 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65  rame->anExec;.#e
11540 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  ndif.  v->aOp = 
11550 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
11560 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
11570 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
11580 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
11590 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
115a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
115b0 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
115c0 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
115d0 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
115e0 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
115f0 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
11600 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
11610 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
11620 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76  me->nChange;.  v
11630 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  ->db->nChange = 
11640 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67  pFrame->nDbChang
11650 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
11660 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d  DeleteAuxData(v-
11670 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74  >db, &v->pAuxDat
11680 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e  a, -1, 0);.  v->
11690 70 41 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d  pAuxData = pFram
116a0 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70  e->pAuxData;.  p
116b0 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20  Frame->pAuxData 
116c0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  = 0;.  return pF
116d0 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
116e0 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
116f0 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
11700 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
11710 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
11720 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
11730 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
11740 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
11750 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
11760 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
11770 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
11780 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
11790 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
117a0 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
117b0 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
117c0 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
117d0 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
117e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
117f0 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
11800 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
11810 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
11820 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
11830 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
11840 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
11850 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
11860 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
11870 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
11880 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
11890 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
118a0 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
118b0 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
118c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
118d0 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
118e0 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  );.  closeCursor
118f0 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69  sInFrame(p);.  i
11900 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
11910 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
11920 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d  y(p->aMem, p->nM
11930 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
11940 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
11950 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
11960 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
11970 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
11980 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
11990 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
119a0 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
119b0 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
119c0 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
119d0 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
119e0 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
119f0 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41  M */.  if( p->pA
11a00 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33  uxData ) sqlite3
11a10 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
11a20 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  a(p->db, &p->pAu
11a30 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
11a40 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78   assert( p->pAux
11a50 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Data==0 );.}../*
11a60 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
11a70 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
11a80 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
11a90 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
11aa0 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
11ab0 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
11ac0 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
11ad0 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
11ae0 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
11af0 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
11b00 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
11b10 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
11b20 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
11b30 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
11b40 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
11b50 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
11b60 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
11b70 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
11b80 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
11b90 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69  nResColumn){.  i
11ba0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
11bb0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
11bc0 69 66 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  if( p->nResColum
11bd0 6e 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  n ){.    release
11be0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
11bf0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
11c00 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
11c10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11c20 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
11c30 65 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 6e 52  e);.  }.  n = nR
11c40 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
11c50 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
11c60 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
11c70 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
11c80 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
11c90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
11ca0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  N(db, sizeof(Mem
11cb0 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
11cc0 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
11cd0 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41  turn;.  initMemA
11ce0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
11cf0 2c 20 6e 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c  , n, db, MEM_Nul
11d00 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  l);.}../*.** Set
11d10 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11d20 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
11d30 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
11d40 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
11d50 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
11d60 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
11d70 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
11d80 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
11d90 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
11da0 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
11db0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
11dc0 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
11dd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
11de0 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
11df0 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
11e00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
11e10 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
11e20 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
11e30 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
11e40 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
11e50 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
11e60 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
11e70 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
11e80 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
11e90 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
11ea0 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
11eb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11ec0 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
11ed0 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
11f00 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
11f10 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
11f40 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
11f50 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
11f60 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f80 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
11f90 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
11fa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11fb0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
11fc0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11fd0 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
11fe0 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
11ff0 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
12000 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
12010 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
12020 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
12030 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
12040 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
12050 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
12060 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
12070 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
12080 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
12090 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
120a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
120b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
120c0 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
120d0 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
120e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
120f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
12100 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
12110 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
12120 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
12130 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
12140 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
12150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
12160 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
12170 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
12180 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
12190 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
121a0 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
121b0 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
121c0 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
121d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
121e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
121f0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
12200 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
12210 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
12220 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
12230 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
12240 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
12250 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
12260 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
12270 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12280 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
12290 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
122a0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
122b0 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
122c0 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
122d0 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
122e0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
122f0 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
12300 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
12310 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
12320 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
12330 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
12340 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
12350 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
12360 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  saction.        
12370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
12380 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  at are candidate
12390 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73  s for a two-phas
123a0 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61  e commit using a
123b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123c0 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
123d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72  urnal */.  int r
123e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
123f0 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
12400 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
12410 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12420 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
12430 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
12440 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
12450 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
12460 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
12470 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
12480 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
12490 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
124a0 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
124b0 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
124c0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
124d0 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
124e0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
124f0 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
12500 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
12510 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
12520 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
12530 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
12540 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
12550 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
12560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12570 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
12580 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
12590 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
125a0 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
125b0 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
125c0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
125d0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
125e0 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
125f0 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
12600 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
12610 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
12620 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
12630 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
12640 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
12650 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
12660 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
12670 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
12680 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
12690 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
126a0 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
126b0 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
126c0 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
126d0 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
126e0 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
126f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
12700 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
12710 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
12720 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
12730 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
12740 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
12750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12760 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
12770 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
12780 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12790 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
127a0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
127b0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
127c0 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
127d0 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69  ot a database mi
127e0 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65  ght need a maste
127f0 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64  r journal depend
12800 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  s upon.      ** 
12810 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  its journal mode
12820 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68   (among other th
12830 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74  ings).  This mat
12840 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77  rix determines w
12850 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  hich.      ** jo
12860 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20  urnal modes use 
12870 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12880 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f   and which do no
12890 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  t */.      stati
128a0 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65  c const u8 aMJNe
128b0 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eded[] = {.     
128c0 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a     /* DELETE   *
128d0 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  /  1,.        /*
128e0 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c   PERSIST   */ 1,
128f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20  .        /* OFF 
12900 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
12910 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20      /* TRUNCATE 
12920 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
12930 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30  * MEMORY    */ 0
12940 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ,.        /* WAL
12950 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20         */ 0.    
12960 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72    };.      Pager
12970 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50   *pPager;   /* P
12980 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
12990 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20  with pBt */.    
129a0 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
129b0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
129c0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
129d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
129e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
129f0 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  r(pBt);.      if
12a00 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66  ( db->aDb[i].saf
12a10 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52  ety_level!=PAGER
12a20 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
12a30 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65  .       && aMJNe
12a40 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65  eded[sqlite3Page
12a50 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
12a60 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 20  pPager)].       
12a70 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
12a80 73 4d 65 6d 64 62 28 70 50 61 67 65 72 29 3d 3d  sMemdb(pPager)==
12a90 30 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20  0.      ){ .    
12aa0 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31      assert( i!=1
12ab0 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61   );.        nTra
12ac0 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns++;.      }.  
12ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12ae0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
12af0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12b00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12b10 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
12b20 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
12b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12b40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
12b50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
12b60 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
12b70 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
12b80 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
12b90 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
12ba0 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
12bb0 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12bc0 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
12bd0 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
12be0 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
12bf0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
12c00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12c10 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12c20 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
12c30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
12c40 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
12c50 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
12c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
12c70 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
12c80 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
12c90 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
12ca0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
12cb0 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
12cc0 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
12cd0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
12ce0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
12cf0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
12d00 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
12d10 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
12d20 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
12d30 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
12d40 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12d50 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
12d60 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
12d70 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
12d80 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
12d90 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
12da0 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
12db0 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
12dc0 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
12dd0 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
12de0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
12df0 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
12e00 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
12e10 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
12e20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
12e30 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
12e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12e50 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
12e60 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
12e70 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12e80 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
12e90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
12ea0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12eb0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
12ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12ed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
12ee0 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
12ef0 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
12f00 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
12f10 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
12f20 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
12f30 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
12f40 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
12f50 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
12f60 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
12f70 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
12f80 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
12f90 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
12fa0 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
12fb0 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
12fc0 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
12fd0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
12fe0 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
12ff0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
13000 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
13010 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
13020 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
13030 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13040 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
13050 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
13060 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
13070 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13080 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
13090 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
130a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
130b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
130c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
130d0 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
130e0 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
130f0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
13100 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
13110 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
13120 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13130 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
13140 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
13150 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13160 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
13170 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
13180 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
13190 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
131a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
131b0 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
131c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
131d0 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
131e0 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  s;.    char *zMa
131f0 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
13200 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
13210 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13220 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
13230 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
13240 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
13250 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
13260 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
13270 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
13280 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
13290 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
132a0 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
132b0 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
132c0 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
132d0 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
132e0 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
132f0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
13300 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
13310 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13320 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
13330 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
13340 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
13350 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
13360 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
13370 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
13380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13390 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64  OMEM_BKPT;.    d
133a0 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
133b0 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
133c0 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
133d0 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
133e0 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
133f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
13400 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
13410 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
13420 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
13430 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
13440 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
13450 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
13460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13470 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
13480 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
13490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
134a0 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
134b0 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
134c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
134d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
134e0 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
134f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
13500 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
13510 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
13520 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
13530 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
13540 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
13550 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
13560 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
13590 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
135a0 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
135b0 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
135c0 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
135d0 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
135e0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
135f0 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
13600 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
13610 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
13620 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
13630 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
13640 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
13650 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
13660 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
13670 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
13680 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
13690 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
136a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
136b0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
136c0 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
136d0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
136e0 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
136f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
13700 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
13710 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
13730 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
13740 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
13750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13760 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
13770 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
13780 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
13790 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
137a0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
137b0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
137c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
137d0 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
137e0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
137f0 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
13800 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
13810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13830 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
13840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13850 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
13860 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
13870 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
13880 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
13890 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
138a0 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
138b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
138c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
138d0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
138e0 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
138f0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
13900 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
13910 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
13920 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
13930 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
13940 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
13950 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13960 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
13970 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
13980 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
13990 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
139a0 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
139b0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
139c0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
139d0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
139e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
139f0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
13a00 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
13a10 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
13a20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
13a30 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
13a40 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
13a50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
13a60 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
13a70 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
13a80 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
13a90 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
13aa0 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
13ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13ac0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
13ad0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
13ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
13af0 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
13b00 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
13b10 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
13b20 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
13b30 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
13b40 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
13b50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13b70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13b80 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
13b90 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
13ba0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13bb0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13bd0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
13be0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
13bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13c10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
13c20 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
13c30 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
13c40 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
13c50 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
13c60 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
13c70 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
13c80 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
13c90 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  f( 0==(sqlite3Os
13ca0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13cb0 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
13cc0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
13cd0 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
13ce0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
13cf0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13d00 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
13d10 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
13d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13d30 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
13d40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
13d50 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
13d60 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
13d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
13d80 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
13d90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
13da0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
13db0 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
13dc0 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
13dd0 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
13de0 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
13df0 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
13e00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13e10 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
13e20 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
13e30 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
13e40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
13e50 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
13e60 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
13e70 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
13e80 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
13e90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13ea0 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
13eb0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
13ec0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
13ed0 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
13ee0 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
13ef0 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
13f00 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
13f10 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
13f20 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
13f30 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
13f40 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
13f50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
13f60 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
13f70 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
13f80 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
13f90 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
13fa0 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
13fb0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
13fc0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
13fd0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
13fe0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
13ff0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
14000 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
14010 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
14020 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14030 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
14040 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
14050 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
14060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
14070 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
14080 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
14090 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
140a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
140b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
140c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
140d0 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
140e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
140f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
14100 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
14110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
14120 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
14130 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
14140 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
14150 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
14160 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
14170 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
14180 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
14190 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
141a0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
141b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
141c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
141d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
141e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
141f0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
14200 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
14210 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
14220 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
14240 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
14250 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
14260 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
14270 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
14280 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
14290 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
142a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
142b0 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
142c0 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
142d0 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
142e0 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
142f0 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
14300 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
14310 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
14320 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
14330 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
14340 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
14350 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
14360 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
14370 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
14380 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
14390 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
143a0 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
143b0 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
143c0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
143d0 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
143e0 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
143f0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
14400 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
14410 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
14420 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
14430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14440 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
14450 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
14460 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
14470 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
14480 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14490 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
144a0 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
144b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
144c0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
144d0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
144e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
144f0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
14500 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
14510 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
14520 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
14530 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
14540 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
14550 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
14560 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
14570 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
14580 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
14590 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
145a0 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
145b0 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
145c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
145d0 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
145e0 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
145f0 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
14600 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
14610 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
14620 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
14630 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
14640 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
14650 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
14660 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
14670 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
14680 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
14690 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
146a0 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
146b0 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
146c0 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
146d0 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
146e0 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
146f0 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
14700 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
14710 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
14720 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
14730 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
14740 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
14750 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
14760 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
14770 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
14780 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
14790 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
147a0 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
147b0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
147c0 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
147d0 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
147e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
147f0 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
14800 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
14810 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
14820 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
14830 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
14840 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
14850 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
14860 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
14870 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
14880 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
14890 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
148a0 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
148b0 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
148c0 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
148d0 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
148e0 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
148f0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
14900 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
14910 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
14920 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
14930 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
14940 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
14950 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
14960 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
14970 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
14980 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
14990 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
149a0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
149b0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
149c0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
149d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
149e0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
149f0 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
14a00 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
14a10 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62  NOINLINE int vdb
14a20 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14a30 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
14a40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
14a50 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
14a60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14a70 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
14a80 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
14a90 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
14aa0 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 61 73 73 65  ement-1;..  asse
14ab0 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
14ac0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
14ad0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
14ae0 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
14af0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
14b00 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
14b10 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
14b20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
14b30 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
14b40 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
14b50 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
14b60 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
14b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 42 74 72  LITE_OK;.    Btr
14b80 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
14b90 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
14ba0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69  ( pBt ){.      i
14bb0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
14bc0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
14bd0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
14be0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
14bf0 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
14c00 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
14c10 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
14c20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
14c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14c40 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
14c50 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
14c60 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
14c70 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
14c80 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
14c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14cb0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
14cc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  }.    }.  }.  db
14cd0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
14ce0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
14cf0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  = 0;..  if( rc==
14d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d10 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
14d20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14d40 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
14d50 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
14d60 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
14d70 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
14d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14d90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
14da0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
14db0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
14dc0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
14dd0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
14de0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  }..  /* If the s
14df0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14e00 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
14e10 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
14e20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 2a  restore the .  *
14e30 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
14e40 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
14e50 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
14e60 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
14e70 61 64 20 77 68 65 6e 20 0a 20 20 2a 2a 20 74 68  ad when .  ** th
14e80 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
14e90 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
14ea0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 65 4f  ed.  */.  if( eO
14eb0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
14ec0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 64 62 2d  LBACK ){.    db-
14ed0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14ee0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
14ef0 3b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  ;.    db->nDefer
14f00 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
14f10 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
14f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14f30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
14f40 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
14f50 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
14f60 4f 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  Op){.  if( p->db
14f70 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
14f80 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
14f90 0a 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65  .    return vdbe
14fa0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
14fb0 2c 20 65 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  , eOp);.  }.  re
14fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
14fe0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14ff0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
15000 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
15010 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
15020 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
15030 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
15040 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
15050 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
15060 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
15070 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
15080 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
15090 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
150a0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
150b0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
150c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
150d0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
150e0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
150f0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
15100 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
15110 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
15120 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
15130 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
15140 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
15150 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
15160 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
15170 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
15180 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
15190 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
151a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
151b0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
151c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
151d0 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
151e0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
151f0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
15200 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
15210 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
15220 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
15230 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
15240 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
15250 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
15260 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
15270 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
15280 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
15290 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
152a0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
152b0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
152c0 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
152d0 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
152e0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
152f0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
15300 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
15310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15320 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
15330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15340 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15360 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
15370 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
15380 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
15390 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
153a0 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
153b0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
153c0 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
153d0 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
153e0 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
153f0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
15400 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
15410 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15420 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
15430 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
15440 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
15450 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
15460 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
15470 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
15480 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
15490 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
154a0 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
154b0 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
154c0 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
154d0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
154e0 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
154f0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
15500 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
15510 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
15520 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
15530 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
15540 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
15550 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
15560 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
15570 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
15580 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
15590 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
155a0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
155b0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
155c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155e0 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
155f0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
15600 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
15610 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
15620 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
15630 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
15640 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
15650 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
15660 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
15670 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
15680 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
15690 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
156a0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
156b0 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
156c0 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
156d0 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
156e0 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
156f0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
15700 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
15710 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
15720 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
15730 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
15740 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
15750 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
15760 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
15770 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
15780 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
15790 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
157a0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
157b0 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
157c0 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
157d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
157e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
157f0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
15800 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
15810 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
15820 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
15830 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
15840 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
15850 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
15860 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
15870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15880 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
15890 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
158a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
158b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
158c0 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72   }.  closeAllCur
158d0 73 6f 72 73 28 70 29 3b 0a 20 20 63 68 65 63 6b  sors(p);.  check
158e0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
158f0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
15900 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
15910 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
15920 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
15930 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
15940 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
15950 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
15960 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
15970 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
15980 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
15990 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
159a0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
159b0 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
159c0 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
159d0 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
159e0 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
159f0 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
15a00 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
15a10 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
15a20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
15a30 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
15a40 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
15a50 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
15a60 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
15a70 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
15a80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
15a90 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
15aa0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
15ab0 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
15ac0 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
15ad0 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
15ae0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
15af0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
15b00 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
15b10 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
15b20 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
15b30 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
15b40 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
15b50 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
15b60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
15b70 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
15b80 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
15b90 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
15ba0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
15bb0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
15bc0 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
15bd0 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
15be0 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
15bf0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
15c00 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
15c10 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
15c20 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
15c30 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
15c40 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
15c50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
15c60 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
15c70 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
15c80 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
15c90 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
15ca0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
15cb0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
15cc0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
15cd0 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
15ce0 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
15cf0 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
15d00 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
15d10 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
15d20 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
15d30 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
15d40 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
15d50 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
15d60 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
15d70 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
15d80 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
15d90 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
15da0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
15db0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
15dc0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
15dd0 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
15de0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
15df0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
15e00 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
15e10 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
15e20 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
15e30 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
15e40 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
15e50 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
15e60 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
15e70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
15e80 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
15e90 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
15ea0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15eb0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
15ec0 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
15ed0 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
15ee0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
15ef0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
15f00 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
15f10 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
15f20 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
15f30 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
15f40 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
15f50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15f60 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
15f70 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
15f80 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
15f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15fa0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15fb0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15fc0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
15fd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
15fe0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
15ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16000 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16010 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
16020 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
16030 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
16040 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
16050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16060 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
16070 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
16080 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
16090 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
160a0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
160b0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
160c0 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
160d0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
160e0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
160f0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
16100 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
16110 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
16120 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
16130 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
16140 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
16150 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
16160 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
16170 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
16180 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
16190 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
161a0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
161b0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
161c0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
161d0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
161e0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
161f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
16200 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16210 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
16220 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
16230 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
16240 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
16250 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
16260 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
16270 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16290 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
162a0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
162b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
162c0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
162d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
162e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
162f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16300 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16310 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
16320 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
16330 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
16340 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
16350 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
16360 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
16370 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
16380 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
16390 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
163a0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
163b0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
163c0 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
163d0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
163e0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
163f0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
16400 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
16410 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
16420 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
16430 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
16440 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
16450 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
16460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16470 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16480 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
16490 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
164a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
164b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
164c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
164d0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
164e0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
164f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16500 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
16510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16520 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
16530 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
16540 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
16550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
16560 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
16570 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
16580 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
16590 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
165a0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
165b0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
165c0 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 44 65 66  ~(u64)SQLITE_Def
165d0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
165e0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
165f0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
16600 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16620 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
16630 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
16640 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OK);.        p->
16650 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
16660 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
16670 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
16680 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
16690 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
166a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
166b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
166c0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
166d0 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
166e0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
166f0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
16700 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
16710 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
16720 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
16730 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
16740 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
16750 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
16760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
16770 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
16780 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
16790 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
167a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
167b0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
167c0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
167d0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
167e0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
167f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16800 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
16810 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
16820 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
16830 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
16840 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
16850 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
16860 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
16870 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
16880 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
16890 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
168a0 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
168b0 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
168c0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
168d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
168e0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
168f0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
16900 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
16910 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
16920 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
16930 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
16940 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
16950 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
16960 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
16970 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16980 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
16990 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
169a0 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
169b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
169c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
169d0 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
169e0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
169f0 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
16a00 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
16a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16a20 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
16a30 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
16a40 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
16a50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16a60 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
16a70 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
16a80 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
16a90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16aa0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
16ab0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
16ac0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
16ad0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
16ae0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
16af0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
16b00 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
16b10 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
16b20 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
16b30 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
16b40 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
16b50 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
16b60 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
16b70 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16b80 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
16b90 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
16ba0 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
16bb0 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
16bc0 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
16bd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
16be0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16bf0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
16c00 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
16c10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16c30 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
16c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
16c50 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
16c60 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
16c70 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
16c80 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
16c90 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
16ca0 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
16cb0 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
16cc0 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
16cd0 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
16ce0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
16cf0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
16d00 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
16d10 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
16d20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
16d30 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
16d40 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
16d50 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
16d60 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
16d70 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
16d80 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
16d90 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
16da0 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
16db0 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
16dc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16dd0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
16de0 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
16df0 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
16e00 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
16e10 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
16e20 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
16e30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
16e40 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
16e50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
16e60 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
16e70 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
16e80 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
16e90 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
16ea0 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
16eb0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
16ec0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
16ed0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
16ee0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
16ef0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
16f00 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
16f10 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
16f20 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
16f30 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
16f40 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
16f50 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
16f60 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
16f70 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
16f80 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
16f90 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
16fa0 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
16fb0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
16fc0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
16fd0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
16fe0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
16ff0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
17000 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
17010 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
17020 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
17030 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
17040 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
17050 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
17060 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
17070 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
17080 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17090 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
170a0 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
170b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
170c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
170d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
170e0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
170f0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
17100 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
17110 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
17120 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
17130 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
17140 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
17150 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
17160 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
17170 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
17180 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
17190 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
171a0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
171b0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
171c0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
171d0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
171e0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
171f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17200 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
17210 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
17220 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
17230 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17240 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
17250 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
17260 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
17270 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
17280 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc++;.    sqlite
17290 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
172a0 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62  oc();.    if( db
172b0 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e  ->pErr==0 ) db->
172c0 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61  pErr = sqlite3Va
172d0 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
172e0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
172f0 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
17300 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
17310 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
17320 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
17330 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
17340 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64  nMalloc();.    d
17350 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
17360 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  --;.  }else if( 
17370 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20  db->pErr ){.    
17380 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e  sqlite3ValueSetN
17390 75 6c 6c 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ull(db->pErr);. 
173a0 20 7d 0a 20 20 64 62 2d 3e 65 72 72 43 6f 64 65   }.  db->errCode
173b0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
173c0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
173d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
173e0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
173f0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
17400 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
17410 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
17420 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
17430 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
17440 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
17450 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
17460 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
17470 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17480 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
17490 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
174a0 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
174b0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
174c0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
174d0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
174e0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
174f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
17500 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
17510 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
17520 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
17530 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17540 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
17560 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
17570 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
17580 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
17590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
175a0 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
175b0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
175c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
175d0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
175e0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
175f0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
17600 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
17610 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
17620 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
17630 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
17640 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
17650 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
17660 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
17670 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
17680 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
17690 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
176a0 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
176b0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
176c0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
176d0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
176e0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
176f0 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
17700 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
17710 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
17720 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
17730 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
17740 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
17750 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
17760 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
17770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17780 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
17790 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
177a0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
177b0 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
177c0 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
177d0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 20  ndif..  sqlite3 
177e0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
177f0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
17800 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
17810 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
17820 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
17830 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
17840 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
17850 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
17860 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
17870 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
17880 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
17890 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
178a0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
178b0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20 65 76   has been run ev
178c0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
178d0 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
178e0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
178f0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
17900 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
17910 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
17920 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
17930 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
17940 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
17950 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
17960 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
17970 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
17980 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
17990 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
179a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
179b0 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
179c0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
179d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
179e0 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
179f0 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
17a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
17a10 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
17a20 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
17a30 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
17a40 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
17a50 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
17a60 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
17a70 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
17a80 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
17a90 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
17aa0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
17ab0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
17ac0 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
17ad0 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
17ae0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
17af0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
17b00 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
17b10 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
17b20 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
17b30 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
17b40 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
17b50 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
17b60 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
17b70 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  p->zErrMsg);.  }
17b80 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 67  ..  /* Reset reg
17b90 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 61  ister contents a
17ba0 6e 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f 72  nd reclaim error
17bb0 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 2e   message memory.
17bc0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
17bd0 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
17be0 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
17bf0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
17c00 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
17c10 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
17c20 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
17c30 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
17c40 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
17c50 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 66 28 20  d up.  */.  if( 
17c60 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
17c70 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
17c80 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
17c90 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
17ca0 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
17cb0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
17cc0 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  <p->nMem; i++) a
17cd0 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
17ce0 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
17cf0 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
17d00 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
17d10 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
17d20 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
17d30 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
17d40 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 23 69 66  sultSet = 0;.#if
17d50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
17d60 0a 20 20 70 2d 3e 6e 57 72 69 74 65 20 3d 20 30  .  p->nWrite = 0
17d70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
17d80 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
17d90 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
17da0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
17db0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
17dc0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
17dd0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
17de0 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
17df0 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
17e00 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
17e10 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
17e20 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
17e30 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
17e40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
17e50 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
17e60 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
17e70 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
17e80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17e90 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
17ea0 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
17eb0 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
17ec0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
17ed0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
17ee0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
17ef0 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
17f00 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
17f10 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
17f20 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
17f30 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
17f40 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
17f50 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
17f60 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
17f70 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
17f80 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
17f90 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
17fa0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
17fb0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
17fc0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
17fd0 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
17fe0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
17ff0 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
18000 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
18010 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
18020 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
18030 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
18040 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
18050 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
18060 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
18070 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
18080 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
18090 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
180a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
180b0 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
180c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
180d0 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
180e0 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
180f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
18100 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
18110 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
18120 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
18130 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65 74  GIC_RESET;.  ret
18140 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
18150 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
18160 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
18170 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
18180 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
18190 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
181a0 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
181b0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
181c0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
181d0 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
181e0 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
181f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
18200 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
18210 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18220 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
18230 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
18240 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
18250 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
18260 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
18270 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
18280 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
18290 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
182a0 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
182b0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
182c0 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
182d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
182e0 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70  If parameter iOp
182f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
18300 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ro, then invoke 
18310 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
18320 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69  or.** all auxili
18330 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
18340 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  s currently cach
18350 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
18360 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69  sed as.** the fi
18370 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
18380 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69  .** Or, if iOp i
18390 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
183a0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
183b0 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75   then the destru
183c0 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  ctor is.** only 
183d0 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73  invoked for thos
183e0 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
183f0 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65   pointers create
18400 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a  d by the user .*
18410 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  * function invok
18420 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e  ed by the OP_Fun
18430 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20  ction opcode at 
18440 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20  instruction iOp 
18450 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c  of .** VM pVdbe,
18460 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69   and only then i
18470 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  f:.**.**    * th
18480 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  e associated fun
18490 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
184a0 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c  is the 32nd or l
184b0 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a  ater (counting.*
184c0 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74  *      from left
184d0 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a   to right), or.*
184e0 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f  *.**    * the co
184f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
18500 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b  in argument mask
18510 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65   is clear (where
18520 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20   the first.**   
18530 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61     function para
18540 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  meter correspond
18550 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
18560 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18570 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
18580 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ta(sqlite3 *db, 
18590 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e  AuxData **pp, in
185a0 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
185b0 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  {.  while( *pp )
185c0 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
185d0 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
185e0 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
185f0 7c 7c 20 28 70 41 75 78 2d 3e 69 41 75 78 4f 70  || (pAux->iAuxOp
18600 3d 3d 69 4f 70 0a 20 20 20 20 20 20 20 20 20 20  ==iOp.          
18610 26 26 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67  && pAux->iAuxArg
18620 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  >=0.          &&
18630 20 28 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3e   (pAux->iAuxArg>
18640 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d  31 || !(mask & M
18650 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69  ASKBIT32(pAux->i
18660 41 75 78 41 72 67 29 29 29 29 0a 20 20 20 20 29  AuxArg)))).    )
18670 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
18680 28 20 70 41 75 78 2d 3e 69 41 75 78 41 72 67 3d  ( pAux->iAuxArg=
18690 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
186a0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 41 75   pAux->xDeleteAu
186b0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  x ){.        pAu
186c0 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 28 70 41  x->xDeleteAux(pA
186d0 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
186e0 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
186f0 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20  Aux->pNextAux;. 
18700 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18710 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  ee(db, pAux);.  
18720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18730 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 41  p= &pAux->pNextA
18740 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ux;.    }.  }.}.
18750 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
18760 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
18770 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
18780 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
18790 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
187a0 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
187b0 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
187c0 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
187d0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
187e0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
187f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
18800 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
18810 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
18820 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
18830 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
18840 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
18850 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
18860 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
18870 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18880 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
18890 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
188a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
188b0 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
188c0 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
188d0 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
188e0 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
188f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
18900 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
18910 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
18920 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
18930 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
18940 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
18950 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
18960 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
18970 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
18980 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
18990 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
189a0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
189b0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
189c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
189d0 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
189e0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
189f0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
18a00 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
18a10 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
18a20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73 71  p->nVar);.    sq
18a30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18a40 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20 20  p->pVList);.    
18a50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18a60 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d  , p->pFree);.  }
18a70 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
18a80 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
18a90 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
18aa0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
18ab0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
18ac0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18ad0 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53  >zSql);.#ifdef S
18ae0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
18af0 4d 41 4c 49 5a 45 0a 20 20 73 71 6c 69 74 65 33  MALIZE.  sqlite3
18b00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e  DbFree(db, p->zN
18b10 6f 72 6d 53 71 6c 29 3b 0a 20 20 7b 0a 20 20 20  ormSql);.  {.   
18b20 20 44 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 54   DblquoteStr *pT
18b30 68 69 73 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  his, *pNext;.   
18b40 20 66 6f 72 28 70 54 68 69 73 3d 70 2d 3e 70 44   for(pThis=p->pD
18b50 62 6c 53 74 72 3b 20 70 54 68 69 73 3b 20 70 54  blStr; pThis; pT
18b60 68 69 73 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  his=pNext){.    
18b70 20 20 70 4e 65 78 74 20 3d 20 70 54 68 69 73 2d    pNext = pThis-
18b80 3e 70 4e 65 78 74 53 74 72 3b 0a 20 20 20 20 20  >pNextStr;.     
18b90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18ba0 62 2c 20 70 54 68 69 73 29 3b 0a 20 20 20 20 7d  b, pThis);.    }
18bb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64  .  }.#endif.#ifd
18bc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18bd0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
18be0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
18bf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
18c00 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
18c10 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
18c20 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
18c30 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  i].zName);.    }
18c40 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
18c50 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29  ee(db, p->aScan)
18c60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
18c70 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
18c80 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
18c90 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
18ca0 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
18cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18cc0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
18cd0 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
18ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18cf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
18d00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
18d10 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
18d20 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
18d30 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
18d40 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
18d50 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
18d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18d70 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
18d80 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
18d90 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
18da0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
18db0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
18dc0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
18dd0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
18de0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
18df0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
18e00 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
18e10 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  eeNN(db, p);.}..
18e20 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
18e30 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
18e40 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
18e50 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
18e60 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
18e70 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
18e80 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
18e90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
18ea0 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
18eb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
18ec0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
18ed0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
18ee0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
18ef0 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
18f00 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
18f10 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
18f20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18f30 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
18f40 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
18f50 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
18f60 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
18f70 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
18f80 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
18f90 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
18fa0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
18fb0 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
18fc0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
18fd0 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
18fe0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
18ff0 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
19000 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
19010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
19020 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
19030 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19040 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
19050 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
19060 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
19070 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
19080 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
19090 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
190a0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
190b0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
190c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
190d0 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
190e0 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
190f0 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
19100 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
19110 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
19120 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
19130 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
19140 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
19150 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
19160 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
19170 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
19180 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
19190 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
191a0 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
191b0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
191c0 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
191d0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
191e0 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
191f0 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
19200 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
19210 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
19220 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
19230 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
19240 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
19250 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
19260 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
19270 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
19280 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
19290 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
192a0 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
192b0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
192c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
192d0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
192e0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
192f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19300 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
19310 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
19320 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
19330 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
19340 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
19350 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
19360 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
19370 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
19380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19390 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
193a0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
193b0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
193c0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
193d0 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
193e0 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
193f0 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
19400 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
19410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
19420 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
19430 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
19440 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
19450 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
19460 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
19470 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19480 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
19490 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
194a0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
194b0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
194c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
194d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
194e0 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
194f0 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
19500 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
19510 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
19520 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
19530 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
19540 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
19550 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
19560 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
19570 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
19580 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
19590 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
195a0 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
195b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
195c0 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
195d0 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
195e0 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
195f0 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
19600 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
19610 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
19620 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
19630 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
19640 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
19650 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
19660 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
19670 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
19680 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
19690 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
196a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
196b0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
196c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
196d0 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
196e0 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
196f0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
19700 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
19710 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
19720 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
19740 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
19750 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
19760 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
19770 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
19780 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
19790 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
197a0 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 43  E_BTREE || p->eC
197b0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
197c0 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 20  PSEUDO );.  if( 
197d0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
197e0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  o ){.    int iMa
197f0 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  p;.    if( p->aA
19800 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d  ltMap && (iMap =
19810 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70   p->aAltMap[1+*p
19820 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20  iCol])>0 ){.    
19830 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
19840 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 69  ursor;.      *pi
19850 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
19860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19870 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
19880 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
19890 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
198a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
198b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
198c0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
198d0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
198e0 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
198f0 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
19900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
19920 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
19930 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
19940 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
19950 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
19960 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
19970 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19980 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
19990 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
199a0 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
199b0 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
199c0 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
199d0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
199e0 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
199f0 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
19a00 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
19a10 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
19a20 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
19a30 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
19a40 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
19a50 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
19a60 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
19a70 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
19a80 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
19a90 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
19aa0 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
19ab0 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
19ac0 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
19ad0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
19ae0 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
19af0 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
19b00 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
19b10 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
19b20 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
19b30 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
19b40 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
19b50 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
19b60 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
19b70 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
19b80 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
19b90 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
19ba0 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
19bb0 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
19bc0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
19bd0 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
19be0 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
19bf0 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
19c00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
19c10 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
19c20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
19c30 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
19c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
19c50 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
19c60 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
19c70 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
19c80 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
19c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
19ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
19cb0 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
19cd0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
19ce0 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
19d00 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
19d10 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
19d20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
19d30 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
19d40 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19d50 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
19d80 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19d90 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
19da0 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
19db0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19dc0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19dd0 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
19de0 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
19df0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
19e00 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
19e30 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
19e40 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
19e50 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
19e60 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
19e70 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
19ea0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
19eb0 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
19ed0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
19ee0 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
19ef0 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
19f20 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
19f30 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
19f40 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
19f50 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
19f60 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
19f70 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
19f80 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
19f90 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
19fa0 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
19fb0 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
19fc0 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
19fd0 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
19fe0 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
19ff0 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
1a000 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
1a010 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
1a020 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
1a030 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
1a040 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
1a050 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
1a060 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
1a070 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
1a080 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c  _format, u32 *pL
1a090 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  en){.  int flags
1a0a0 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
1a0b0 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65    u32 n;..  asse
1a0c0 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20  rt( pLen!=0 );. 
1a0d0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
1a0e0 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  ull ){.    *pLen
1a0f0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1a100 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
1a110 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
1a120 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1a130 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
1a140 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
1a150 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
1a160 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
1a170 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
1a180 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
1a190 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
1a1a0 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
1a1b0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1a1c0 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
1a1d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
1a1e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a1f0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
1a200 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20  if( (i&1)==i && 
1a210 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
1a220 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
1a230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
1a240 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20  urn 8+(u32)u;.  
1a250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a260 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20     *pLen = 1;.  
1a270 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a290 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
1a2a0 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74  { *pLen = 2; ret
1a2b0 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28  urn 2; }.    if(
1a2c0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a   u<=8388607 ){ *
1a2d0 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e  pLen = 3; return
1a2e0 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   3; }.    if( u<
1a2f0 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a  =2147483647 ){ *
1a300 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e  pLen = 4; return
1a310 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c   4; }.    if( u<
1a320 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70  =MAX_6BYTE ){ *p
1a330 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20  Len = 6; return 
1a340 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  5; }.    *pLen =
1a350 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   8;.    return 6
1a360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
1a370 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
1a380 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
1a390 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
1a3a0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
1a3b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a3c0 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
1a3d0 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
1a3e0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
1a3f0 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
1a400 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
1a410 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
1a420 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
1a430 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
1a440 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20  .  *pLen = n;.  
1a450 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
1a460 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
1a470 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
1a480 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66  *.** The sizes f
1a490 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  or serial types 
1a4a0 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f  less than 128.*/
1a4b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
1a4c0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1a4d0 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20  eSizes[] = {.   
1a4e0 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20       /*  0   1  
1a4f0 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20   2   3   4   5  
1a500 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a   6   7   8   9 *
1a510 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20  /   ./*   0 */  
1a520 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20   0,  1,  2,  3, 
1a530 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20   4,  6,  8,  8, 
1a540 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a   0,  0,./*  10 *
1a550 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
1a560 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20  0,  1,  1,  2,  
1a570 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32  2,  3,  3,./*  2
1a580 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35  0 */   4,  4,  5
1a590 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37  ,  5,  6,  6,  7
1a5a0 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a  ,  7,  8,  8,./*
1a5b0 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c    30 */   9,  9,
1a5c0 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c   10, 10, 11, 11,
1a5d0 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c   12, 12, 13, 13,
1a5e0 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20  ./*  40 */  14, 
1a5f0 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20  14, 15, 15, 16, 
1a600 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20  16, 17, 17, 18, 
1a610 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31  18,./*  50 */  1
1a620 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32  9, 19, 20, 20, 2
1a630 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32  1, 21, 22, 22, 2
1a640 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f  3, 23,./*  60 */
1a650 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35    24, 24, 25, 25
1a660 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37  , 26, 26, 27, 27
1a670 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30  , 28, 28,./*  70
1a680 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c   */  29, 29, 30,
1a690 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c   30, 31, 31, 32,
1a6a0 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20   32, 33, 33,./* 
1a6b0 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20   80 */  34, 34, 
1a6c0 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20  35, 35, 36, 36, 
1a6d0 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a  37, 37, 38, 38,.
1a6e0 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33  /*  90 */  39, 3
1a6f0 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34  9, 40, 40, 41, 4
1a700 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34  1, 42, 42, 43, 4
1a710 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34  3,./* 100 */  44
1a720 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36  , 44, 45, 45, 46
1a730 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38  , 46, 47, 47, 48
1a740 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20  , 48,./* 110 */ 
1a750 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c   49, 49, 50, 50,
1a760 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c   51, 51, 52, 52,
1a770 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20   53, 53,./* 120 
1a780 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20  */  54, 54, 55, 
1a790 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20  55, 56, 56, 57, 
1a7a0 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  57.};../*.** Ret
1a7b0 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
1a7c0 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
1a7d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
1a7e0 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
1a7f0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
1a800 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1a810 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
1a820 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
1a830 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29  rial_type>=128 )
1a840 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
1a850 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1a860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1a870 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
1a880 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20  e<12 .          
1a890 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c    || sqlite3Smal
1a8a0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
1a8b0 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c  l_type]==(serial
1a8c0 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b  _type - 12)/2 );
1a8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
1a8e0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
1a8f0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
1a900 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33    }.}.u8 sqlite3
1a910 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61  VdbeOneByteSeria
1a920 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69  lTypeLen(u8 seri
1a930 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65  al_type){.  asse
1a940 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
1a950 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  128 );.  return 
1a960 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1a970 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
1a980 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e];  .}../*.** I
1a990 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
1a9a0 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
1a9b0 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
1a9c0 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
1a9d0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
1a9e0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
1a9f0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
1aa00 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
1aa10 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
1aa20 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
1aa30 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
1aa40 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
1aa50 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
1aa60 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
1aa70 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
1aa80 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
1aa90 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
1aaa0 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
1aab0 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
1aac0 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
1aad0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
1aae0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
1aaf0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
1ab00 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
1ab10 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
1ab20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
1ab30 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
1ab40 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
1ab50 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
1ab60 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
1ab70 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
1ab80 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
1ab90 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
1aba0 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
1abb0 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
1abc0 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
1abd0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
1abe0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
1abf0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
1ac00 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
1ac10 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
1ac20 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
1ac30 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
1ac40 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
1ac50 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
1ac60 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
1ac70 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
1ac80 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
1ac90 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
1aca0 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
1acb0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
1acc0 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
1acd0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
1ace0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
1acf0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1ad00 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
1ad10 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1ad20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
1ad30 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
1ad40 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
1ad50 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
1ad60 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
1ad70 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
1ad80 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
1ad90 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
1ada0 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
1adb0 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
1adc0 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
1add0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
1ade0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
1adf0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
1ae00 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
1ae10 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
1ae20 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
1ae30 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
1ae40 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
1ae50 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
1ae60 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
1ae70 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
1ae80 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
1ae90 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
1aea0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
1aeb0 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
1aec0 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
1aed0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
1aee0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
1aef0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
1af00 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
1af10 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
1af20 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
1af30 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
1af40 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
1af50 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
1af60 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
1af70 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
1af80 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
1af90 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
1afa0 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
1afb0 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
1afc0 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
1afd0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
1afe0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
1aff0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
1b000 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
1b010 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b020 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
1b030 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
1b040 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
1b050 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
1b060 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
1b070 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
1b080 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
1b090 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
1b0a0 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
1b0b0 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
1b0c0 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
1b0d0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
1b0e0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
1b0f0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
1b100 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
1b110 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
1b120 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
1b130 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b140 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
1b150 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
1b160 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
1b170 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
1b180 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
1b190 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1b1a0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
1b1b0 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
1b1c0 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
1b1d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1b1e0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
1b1f0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
1b200 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
1b210 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
1b220 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
1b230 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
1b240 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
1b250 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
1b260 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
1b270 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
1b280 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
1b290 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
1b2a0 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
1b2b0 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
1b2c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b2d0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1b2e0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
1b2f0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
1b300 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
1b310 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
1b320 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
1b330 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
1b340 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
1b350 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
1b360 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
1b370 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
1b380 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
1b390 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
1b3a0 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
1b3b0 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
1b3c0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
1b3d0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
1b3e0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1b3f0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
1b400 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
1b410 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
1b420 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b430 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
1b440 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
1b450 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
1b460 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
1b470 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
1b480 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
1b490 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
1b4a0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
1b4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
1b4c0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
1b4d0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
1b4e0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
1b4f0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
1b500 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe];.    assert(
1b510 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
1b520 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
1b530 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
1b540 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
1b550 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
1b560 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
1b570 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
1b580 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
1b590 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1b5a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b5b0 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
1b5c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1b5d0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
1b5e0 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
1b5f0 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
1b600 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1b610 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
1b620 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
1b630 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65  m->n;.    if( le
1b640 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66  n>0 ) memcpy(buf
1b650 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
1b660 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
1b670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
1b680 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
1b690 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
1b6a0 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22  0;.}../* Input "
1b6b0 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65  x" is a sequence
1b6c0 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61   of unsigned cha
1b6d0 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70  racters that rep
1b6e0 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d  resent a.** big-
1b6f0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20  endian integer. 
1b700 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69   Return the equi
1b710 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e  valent native in
1b720 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  teger.*/.#define
1b730 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29   ONE_BYTE_INT(x)
1b740 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29      ((i8)(x)[0])
1b750 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54  .#define TWO_BYT
1b760 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36  E_INT(x)    (256
1b770 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78  *(i8)((x)[0])|(x
1b780 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48  )[1]).#define TH
1b790 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  REE_BYTE_INT(x) 
1b7a0 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29   (65536*(i8)((x)
1b7b0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29  [0])|((x)[1]<<8)
1b7c0 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65  |(x)[2]).#define
1b7d0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1b7e0 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30  x)  (((u32)(x)[0
1b7f0 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c  ]<<24)|((x)[1]<<
1b800 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1b810 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[3]).#define 
1b820 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29  FOUR_BYTE_INT(x)
1b830 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28   (16777216*(i8)(
1b840 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
1b850 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
1b860 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20  |(x)[3])../*.** 
1b870 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
1b880 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
1b890 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
1b8a0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
1b8b0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
1b8c0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
1b8d0 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
1b8e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b8f0 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  tes read..**.** 
1b900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b910 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1b920 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75  two separate rou
1b930 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72  tines for perfor
1b940 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65  mance..** The fe
1b950 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71  w cases that req
1b960 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61  uire local varia
1b970 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  bles are broken 
1b980 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72  out into a separ
1b990 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  ate.** routine s
1b9a0 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63  o that in most c
1b9b0 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61  ases the overhea
1b9c0 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20  d of moving the 
1b9d0 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a  stack pointer.**
1b9e0 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20   is avoided..*/ 
1b9f0 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49  .static u32 SQLI
1ba00 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69  TE_NOINLINE seri
1ba10 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
1ba20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
1ba30 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
1ba40 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1ba50 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
1ba60 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
1ba70 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1ba80 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
1ba90 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
1baa0 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
1bab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1bac0 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
1bad0 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
1bae0 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52  {.  u64 x = FOUR
1baf0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
1bb00 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f  .  u32 y = FOUR_
1bb10 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
1bb20 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20  ;.  x = (x<<32) 
1bb30 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61  + y;.  if( seria
1bb40 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
1bb50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1bb60 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56   R-29851-52272 V
1bb70 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1bb80 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20  dian 64-bit.    
1bb90 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1bba0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1bbb0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
1bbc0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d  (i64*)&x;.    pM
1bbd0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1bbe0 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Int;.    testcas
1bbf0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1bc00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1bc10 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bc20 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c  -57343-49114 Val
1bc30 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1bc40 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38  an IEEE 754-2008
1bc50 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66   64-bit.    ** f
1bc60 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
1bc70 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65  mber. */.#if !de
1bc80 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
1bc90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bca0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1bcb0 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72  OINT).    /* Ver
1bcc0 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
1bcd0 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
1bce0 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
1bcf0 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20  the same.    ** 
1bd00 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
1bd10 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
1bd20 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
1bd30 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
1bd40 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
1bd50 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
1bd60 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
1bd70 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
1bd80 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
1bd90 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
1bda0 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
1bdb0 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
1bdc0 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20  <32;.    static 
1bdd0 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20  const double r1 
1bde0 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74  = 1.0;.    u64 t
1bdf0 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70  2 = t1;.    swap
1be00 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
1be10 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74  (t2);.    assert
1be20 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
1be30 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
1be40 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
1be50 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
1be60 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1be70 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
1be80 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  & sizeof(pMem->u
1be90 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77  .r)==8 );.    sw
1bea0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1beb0 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  at(x);.    memcp
1bec0 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78  y(&pMem->u.r, &x
1bed0 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
1bee0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1bef0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
1bf00 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75  m->u.r) ? MEM_Nu
1bf10 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  ll : MEM_Real;. 
1bf20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d   }.  return 8;.}
1bf30 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
1bf40 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
1bf50 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bf60 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
1bf70 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
1bf80 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
1bf90 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1bfb0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
1bfc0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
1bfd0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bff0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
1c000 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
1c010 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
1c020 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1c030 20 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a     case 10: { /*
1c040 20 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   Internal use on
1c050 6c 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69  ly: NULL with vi
1c060 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20  rtual table.    
1c070 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50             ** UP
1c080 44 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66  DATE no-change f
1c090 6c 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  lag set */.     
1c0a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1c0b0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f  EM_Null|MEM_Zero
1c0c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1c0d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  = 0;.      pMem-
1c0e0 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  >u.nZero = 0;.  
1c0f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c100 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
1c110 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1c120 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1c130 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
1c140 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  Null */.      /*
1c150 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c160 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75  24078-09375 Valu
1c170 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a  e is a NULL. */.
1c180 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1c190 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1c1a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c1b0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20  .    case 1: {. 
1c1c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c1d0 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31  -OF: R-44885-251
1c1e0 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38  96 Value is an 8
1c1f0 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65  -bit twos-comple
1c200 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ment.      ** in
1c210 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1c220 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f  pMem->u.i = ONE_
1c230 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1c240 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c250 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1c260 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1c270 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1c280 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1c290 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1c2a0 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1c2b0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c2c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c2d0 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56   R-49794-35026 V
1c2e0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c2f0 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20  dian 16-bit.    
1c300 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1c310 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1c320 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c330 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1c340 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1c350 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1c360 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1c370 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1c380 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
1c390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c3a0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1c3b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c3c0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1c3d0 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d  NCE-OF: R-37839-
1c3e0 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61  54301 Value is a
1c3f0 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62   big-endian 24-b
1c400 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1c410 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1c420 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1c430 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
1c440 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1c450 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c460 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1c470 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1c480 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1c490 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
1c4a0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1c4b0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1c4c0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c4d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c4e0 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56   R-01849-26079 V
1c4f0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1c500 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20  dian 32-bit.    
1c510 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1c520 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1c530 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1c540 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
1c550 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f  (buf);.#ifdef __
1c560 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20  HP_cc .      /* 
1c570 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69  Work around a si
1c580 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67  gn-extension bug
1c590 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69   in the HP compi
1c5a0 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f  ler for HP/UX */
1c5b0 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30  .      if( buf[0
1c5c0 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75  ]&0x80 ) pMem->u
1c5d0 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66  .i |= 0xffffffff
1c5e0 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64  80000000LL;.#end
1c5f0 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  if.      pMem->f
1c600 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1c610 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c620 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1c630 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
1c640 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1c650 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1c660 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c670 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1c680 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
1c690 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
1c6a0 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
1c6b0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1c6c0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1c6d0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1c6e0 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1c6f0 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
1c700 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1c710 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
1c720 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c730 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1c740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
1c750 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
1c760 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
1c770 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
1c780 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1c790 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c7a0 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
1c7b0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
1c7c0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
1c7d0 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
1c7e0 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
1c7f0 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
1c800 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
1c810 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
1c820 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
1c830 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
1c840 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1c850 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1c860 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
1c870 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
1c880 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c890 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
1c8a0 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
1c8b0 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
1c8c0 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
1c8d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
1c8e0 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
1c8f0 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
1c900 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1c910 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
1c920 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
1c930 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
1c940 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1c950 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
1c960 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
1c970 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1c980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c990 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1c9a0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
1c9b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
1c9c0 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
1c9d0 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
1c9e0 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
1c9f0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
1ca00 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
1ca10 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
1ca20 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
1ca30 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
1ca40 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
1ca50 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
1ca60 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
1ca70 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
1ca80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
1ca90 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
1caa0 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
1cab0 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
1cac0 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
1cad0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
1cae0 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
1caf0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1cb00 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
1cb10 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
1cb20 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
1cb30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
1cb40 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
1cb50 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
1cb60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cb70 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
1cb80 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
1cb90 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
1cba0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
1cbb0 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
1cbc0 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
1cbd0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
1cbe0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
1cbf0 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
1cc00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
1cc10 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
1cc20 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
1cc30 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
1cc40 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
1cc50 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
1cc60 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1cc70 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
1cc80 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
1cc90 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
1cca0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
1ccb0 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
1ccc0 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
1ccd0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
1cce0 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
1ccf0 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
1cd00 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
1cd10 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
1cd20 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
1cd30 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
1cd40 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
1cd50 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
1cd60 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
1cd70 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
1cd80 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
1cd90 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
1cda0 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
1cdb0 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
1cdc0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
1cdd0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1cde0 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1cdf0 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
1ce00 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
1ce10 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
1ce20 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
1ce30 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1ce50 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
1ce60 65 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  e record */.){. 
1ce70 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1ce80 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1ce90 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1cea0 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1ceb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1cee0 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1cef0 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65  or *p */.  nByte
1cf00 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
1cf10 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1cf20 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
1cf30 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46  (pKeyInfo->nKeyF
1cf40 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28  ield+1);.  p = (
1cf50 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1cf60 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1cf70 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
1cf80 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1cf90 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1cfa0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
1cfb0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
1cfc0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1cfd0 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
1cfe0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1cff0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1d000 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
1d010 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1d020 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
1d030 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b  nfo->nKeyField +
1d040 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
1d050 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1d060 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
1d070 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
1d080 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
1d090 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
1d0a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
1d0b0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1d0c0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
1d0d0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
1d0e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1d0f0 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
1d100 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
1d110 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1d120 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
1d130 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
1d140 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1d150 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
1d160 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
1d170 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1d180 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1d190 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1d1a0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1d1b0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1d1c0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1d1d0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1d1e0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
1d1f0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
1d200 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
1d210 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
1d220 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1d230 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1d240 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1d250 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
1d260 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1d290 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
1d2a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
1d2b0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1d2d0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1d2e0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
1d2f0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
1d300 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
1d310 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
1d320 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1d330 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1d340 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
1d350 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1d360 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
1d370 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
1d380 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1d390 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
1d3a0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
1d3b0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
1d3c0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1d3d0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
1d3e0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
1d3f0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
1d400 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
1d410 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
1d420 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
1d430 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
1d440 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d450 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
1d460 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
1d470 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1d480 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d  oc = 0;.    pMem
1d490 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  ->z = 0;.    d +
1d4a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1d4b0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1d4c0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1d4d0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1d4e0 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1d4f0 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1d500 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 3e 6e  k;.  }.  if( d>n
1d510 4b 65 79 20 26 26 20 75 20 29 7b 0a 20 20 20 20  Key && u ){.    
1d520 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1d530 44 42 20 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 20  DB );.    /* In 
1d540 61 20 63 6f 72 72 75 70 74 20 72 65 63 6f 72 64  a corrupt record
1d550 20 65 6e 74 72 79 2c 20 74 68 65 20 6c 61 73 74   entry, the last
1d560 20 70 4d 65 6d 20 6d 69 67 68 74 20 68 61 76 65   pMem might have
1d570 20 62 65 65 6e 20 73 65 74 20 75 70 20 75 73 69   been set up usi
1d580 6e 67 20 0a 20 20 20 20 2a 2a 20 75 6e 69 6e 69  ng .    ** unini
1d590 74 69 61 6c 69 7a 65 64 20 6d 65 6d 6f 72 79 2e  tialized memory.
1d5a0 20 4f 76 65 72 77 72 69 74 65 20 69 74 73 20 76   Overwrite its v
1d5b0 61 6c 75 65 20 77 69 74 68 20 4e 55 4c 4c 2c 20  alue with NULL, 
1d5c0 74 6f 20 70 72 65 76 65 6e 74 0a 20 20 20 20 2a  to prevent.    *
1d5d0 2a 20 77 61 72 6e 69 6e 67 73 20 66 72 6f 6d 20  * warnings from 
1d5e0 4d 53 41 4e 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  MSAN. */.    sql
1d5f0 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
1d600 6c 6c 28 70 4d 65 6d 2d 31 29 3b 0a 20 20 7d 0a  ll(pMem-1);.  }.
1d610 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
1d620 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1d630 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
1d640 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 64  eld = u;.}..#ifd
1d650 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1d660 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d670 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
1d680 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
1d690 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
1d6a0 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
1d6b0 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
1d6c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1d6d0 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
1d6e0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
1d6f0 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
1d700 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1d710 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
1d720 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
1d730 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
1d740 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
1d750 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1d760 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
1d770 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
1d780 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1d790 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
1d7a0 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
1d7b0 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
1d7c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1d7d0 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
1d7e0 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
1d7f0 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
1d800 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
1d810 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  rue if the resul
1d820 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
1d830 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1d840 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a   desiredResult..
1d850 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
1d860 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
1d870 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  sagreement..*/.s
1d880 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1d890 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1d8a0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1d8b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1d8c0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1d8d0 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
1d8e0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1d8f0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1d900 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65  .  int desiredRe
1d910 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
1d920 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77   /* Correct answ
1d930 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  er */.){.  u32 d
1d940 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
1d950 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1d960 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1d970 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1d980 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1d990 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1d9a0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
1d9b0 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
1d9c0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1d9d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d9e0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
1d9f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
1da00 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
1da10 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1da20 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1da30 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1da40 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1da50 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1da60 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
1da70 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
1da80 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
1da90 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
1daa0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1dab0 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
1dac0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
1dad0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1dae0 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
1daf0 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
1db00 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
1db10 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
1db20 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
1db30 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1db40 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1db50 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1db60 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1db70 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
1db80 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
1db90 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
1dba0 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
1dbb0 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
1dbc0 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
1dbd0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
1dbe0 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
1dbf0 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
1dc00 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
1dc10 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
1dc20 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
1dc30 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
1dc40 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
1dc50 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
1dc60 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
1dc70 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
1dc80 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
1dc90 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
1dca0 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
1dcb0 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
1dcc0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
1dcd0 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
1dce0 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
1dcf0 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
1dd00 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
1dd10 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
1dd20 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
1dd30 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1dd40 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
1dd50 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
1dd60 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
1dd70 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
1dd80 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
1dd90 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1dda0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1ddb0 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e  );.  if( szHdr1>
1ddc0 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53  98307 ) return S
1ddd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
1dde0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1ddf0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1de00 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b  ->nAllField>=pPK
1de10 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
1de20 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1de30 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1de40 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1de50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1de60 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e  Info->nKeyField>
1de70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1de80 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1de90 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1dea0 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1deb0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1dec0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1ded0 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1dee0 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1def0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1df00 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1df10 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1df20 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1df30 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1df40 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1df50 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1df60 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1df70 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1df80 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1df90 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1dfa0 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1dfb0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1dfc0 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1dfd0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1dfe0 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1dff0 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1e000 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1e010 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1e020 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1e030 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1e040 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1e050 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1e060 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1e070 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1e080 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 28 75  */.    if( d1+(u
1e090 36 34 29 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  64)serial_type1+
1e0a0 32 3e 28 75 36 34 29 6e 4b 65 79 31 0a 20 20 20  2>(u64)nKey1.   
1e0b0 20 20 26 26 20 64 31 2b 28 75 36 34 29 73 71 6c    && d1+(u64)sql
1e0c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1e0d0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1e0e0 65 31 29 3e 28 75 36 34 29 6e 4b 65 79 31 20 0a  e1)>(u64)nKey1 .
1e0f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1e100 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1e110 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1e120 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
1e130 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1e140 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1e150 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1e160 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1e170 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
1e180 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
1e190 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
1e1a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
1e1b0 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
1e1c0 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
1e1d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
1e1f0 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
1e200 3e 69 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  >i ? pKeyInfo->a
1e210 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20  Coll[i] : 0);.  
1e220 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1e230 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1e240 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1e250 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1e260 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1e270 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1e280 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1e290 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1e2a0 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
1e2b0 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
1e2c0 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
1e2d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1e2e0 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
1e2f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
1e300 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1e310 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
1e320 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
1e330 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1e340 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1e350 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1e360 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1e370 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1e380 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1e390 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1e3a0 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1e3b0 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1e3c0 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1e3d0 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1e3e0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1e3f0 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1e400 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1e410 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1e420 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1e430 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1e440 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1e450 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1e460 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1e470 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1e480 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1e490 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1e4a0 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1e4b0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1e4c0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1e4d0 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1e4e0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1e4f0 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1e500 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1e510 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1e520 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1e530 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1e540 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1e550 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1e560 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1e570 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1e580 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1e590 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e5a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1e5b0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1e5c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1e5d0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1e5e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1e5f0 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1e600 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1e610 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1e620 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1e630 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1e640 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1e650 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e660 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1e670 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1e680 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a  >nAllField..**.*
1e690 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72  * If this constr
1e6a0 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69  aint is not sati
1e6b0 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20  sfied, it means 
1e6c0 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70  that the high-sp
1e6d0 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72  eed.** vdbeRecor
1e6e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1e6f0 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  d vdbeRecordComp
1e700 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74  areString() rout
1e710 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  ines will.** not
1e720 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1e730 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74    If this assert
1e740 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69  () ever fires, i
1e750 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73  t probably means
1e760 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79  .** that the Key
1e770 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f  Info.nKeyField o
1e780 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69  r KeyInfo.nAllFi
1e790 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1e7a0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1e7b0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1e7c0 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1e7d0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1e7e0 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1e7f0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1e800 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1e810 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1e820 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1e830 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1e840 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1e850 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1e860 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1e870 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1e880 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1e890 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1e8a0 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1e8b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1e8c0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1e8d0 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1e8e0 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1e8f0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1e900 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1e910 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1e920 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1e930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1e940 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1e950 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1e960 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1e970 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1e980 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1e990 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1e9a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1e9b0 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1e9c0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a  o->nAllField );.
1e9d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1e9e0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1e9f0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1ea00 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1ea10 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1ea20 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1ea30 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1ea40 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1ea50 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1ea60 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1ea70 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1ea80 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1ea90 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1eaa0 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1eab0 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1eac0 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1ead0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1eae0 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1eaf0 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1eb00 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1eb10 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1eb20 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1eb30 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1eb40 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1eb50 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1eb60 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1eb70 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1eb80 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1eb90 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1eba0 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ebc0 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1ebd0 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1ebe0 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1ebf0 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1ec00 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1ec10 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1ec20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1ec30 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1ec40 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1ec50 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1ec60 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1ec70 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1ec80 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1ec90 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1eca0 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1ecb0 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1ecc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1ecd0 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1ece0 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1ecf0 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1ed00 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1ed10 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1ed20 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1ed30 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1ed40 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1ed50 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1ed60 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1ed70 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1ed80 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1ed90 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1eda0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1edb0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1edc0 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1edd0 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1ede0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1edf0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1ee00 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1ee10 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  );.    v2 = sqli
1ee20 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1ee30 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1ee40 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1ee50 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c     if( (v1==0 ||
1ee60 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20   v2==0) ){.     
1ee70 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70   if( prcErr ) *p
1ee80 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1ee90 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1eea0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
1eeb0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1eec0 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1eed0 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76  ->pUser, c1.n, v
1eee0 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20  1, c2.n, v2);.  
1eef0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1ef00 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1ef10 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1ef20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1ef30 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
1ef40 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1ef50 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20  The input pBlob 
1ef60 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1ef70 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20   be a Blob that 
1ef80 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a  is not marked.**
1ef90 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20   with MEM_Zero. 
1efa0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1efb0 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65  it could be a ze
1efc0 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ro-blob..*/.stat
1efd0 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f  ic int isAllZero
1efe0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1eff0 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
1f000 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1f010 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1f020 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
1f030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1f040 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1f050 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1f060 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1f070 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1f080 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1f090 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1f0a0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1f0b0 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1f0c0 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1f0d0 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1f0e0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1f0f0 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1f100 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1f110 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51  he lessor..*/.SQ
1f120 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1f130 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1f140 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1f150 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1f160 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1f170 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1f180 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1f190 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1f1a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1f1b0 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1f1c0 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1f1d0 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1f1e0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1f1f0 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1f200 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1f210 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1f220 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1f230 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1f240 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1f250 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1f260 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1f270 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1f280 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1f290 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1f2a0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1f2b0 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1f2c0 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1f2d0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1f2e0 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1f2f0 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1f300 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1f310 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1f320 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1f330 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1f340 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1f350 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1f360 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1f370 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1f380 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1f390 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1f3a0 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1f3b0 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1f3c0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1f3d0 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1f3e0 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1f3f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1f400 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1f410 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1f420 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1f430 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1f440 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1f450 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1f460 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1f470 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1f480 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1f490 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1f4a0 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1f4b0 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1f4c0 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1f4d0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1f4e0 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1f4f0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1f500 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1f510 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1f520 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1f530 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1f540 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1f550 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1f560 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1f570 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1f580 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1f590 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1f5a0 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1f5b0 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1f5c0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1f5d0 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1f5e0 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1f5f0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1f600 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1f610 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f620 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1f630 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1f640 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1f650 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1f660 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1f670 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1f680 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1f690 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39 32  1;.    if( r>=92
1f6a0 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1f6b0 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  8.0 ) return -1;
1f6c0 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b  .    y = (i64)r;
1f6d0 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72  .    if( i<y ) r
1f6e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1f6f0 28 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20 2b  ( i>y ) return +
1f700 31 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62  1;.    s = (doub
1f710 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c  le)i;.    if( s<
1f720 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1f730 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74     if( s>r ) ret
1f740 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1f750 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
1f760 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1f770 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1f780 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1f790 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1f7a0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1f7b0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1f7c0 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1f7d0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1f7e0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1f7f0 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1f800 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1f810 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1f820 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1f830 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1f840 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1f850 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1f860 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1f870 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1f880 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1f890 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1f8a0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1f8b0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1f8c0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1f8d0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1f8e0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1f8f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1f900 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1f910 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1f920 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1f930 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1f940 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1f950 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1f960 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1f970 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1f980 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1f990 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1f9a0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1f9b0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1f9c0 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d  t( !sqlite3VdbeM
1f9d0 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 31  emIsRowSet(pMem1
1f9e0 29 20 26 26 20 21 73 71 6c 69 74 65 33 56 64 62  ) && !sqlite3Vdb
1f9f0 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65  eMemIsRowSet(pMe
1fa00 6d 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  m2) );. .  /* If
1fa10 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1fa20 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1fa30 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1fa40 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1fa50 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1fa60 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1fa70 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1fa80 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1fa90 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1faa0 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1fab0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1fac0 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   At least one of
1fad0 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
1fae0 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f  is a number.  */
1faf0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1fb00 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1fb10 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1fb20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1fb30 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1fb40 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1fb50 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
1fb60 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1fb70 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1fb80 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
1fb90 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1fba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1fbb0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  }.    if( (f1 & 
1fbc0 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d  f2 & MEM_Real)!=
1fbd0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1fbe0 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d  Mem1->u.r < pMem
1fbf0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1fc00 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1fc10 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32  em1->u.r > pMem2
1fc20 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b  ->u.r ) return +
1fc30 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1fc40 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1fc50 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1fc60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1fc70 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  2&MEM_Real)!=0 )
1fc80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fc90 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1fca0 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75  Compare(pMem1->u
1fcb0 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b  .i, pMem2->u.r);
1fcc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fcd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1fce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fcf0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1fd00 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1fd10 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1fd20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1fd30 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49  return -sqlite3I
1fd40 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1fd50 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31  Mem2->u.i, pMem1
1fd60 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1fd70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1fd80 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1fd90 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1fda0 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   +1;.  }..  /* I
1fdb0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1fdc0 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1fdd0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1fde0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1fdf0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1fe00 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1fe10 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1fe20 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1fe30 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1fe40 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1fe50 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1fe60 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1fe70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1fe80 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1fe90 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1fea0 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1feb0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1fec0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1fed0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1fee0 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e  ->enc || pMem1->
1fef0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ff00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ff10 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1ff20 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1ff30 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1ff40 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1ff50 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1ff60 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1ff70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1ff80 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1ff90 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1ffa0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1ffb0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1ffc0 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1ffd0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1ffe0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1fff0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
20000 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
20010 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
20020 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
20030 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
20040 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
20050 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
20060 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
20070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
20080 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
20090 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
200a0 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
200b0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
200c0 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
200d0 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
200e0 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
200f0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
20100 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
20110 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
20120 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
20130 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
20140 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
20150 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
20160 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
20170 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
20180 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
20190 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
201a0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
201b0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
201c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
201d0 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
201e0 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
201f0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
20200 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
20210 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
20220 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
20230 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
20240 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
20250 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
20260 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
20270 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
20280 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
20290 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
202a0 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
202b0 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
202c0 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
202d0 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
202e0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
202f0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
20300 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
20310 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
20320 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
20330 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
20340 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
20350 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
20360 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
20370 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
20380 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
20390 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
203a0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
203b0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
203c0 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
203d0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
203e0 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
203f0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
20400 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
20410 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
20420 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
20430 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
20440 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
20450 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20460 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
20470 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
20480 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
20490 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
204a0 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
204b0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
204c0 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
204d0 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
204e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
204f0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
20500 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
20510 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
20520 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
20530 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
20540 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
20550 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20560 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
20570 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
20580 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20590 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
205a0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
205b0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
205c0 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
205d0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
205e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
205f0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
20600 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
20610 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
20620 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
20630 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
20640 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
20650 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
20660 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
20670 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
20680 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
20690 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
206a0 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
206b0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
206c0 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
206d0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
206e0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
206f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
20700 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
20710 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
20720 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
20730 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
20740 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
20750 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
20760 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
20770 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
20780 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
20790 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
207a0 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
207b0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
207c0 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
207d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
207e0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
207f0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
20800 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
20810 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
20820 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
20830 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
20840 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
20850 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
20860 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
20870 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
20880 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
20890 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
208a0 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
208b0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
208c0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
208d0 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
208e0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
208f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20900 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
20910 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
20920 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
20930 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
20940 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
20950 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
20960 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
20970 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
20980 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
20990 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
209a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
209b0 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
209c0 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
209d0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
209e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
209f0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
20a00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20a10 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
20a20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20a30 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
20a40 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
20a50 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20a60 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
20a70 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
20a80 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
20ab0 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
20ac0 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
20ad0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20af0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
20b00 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
20b10 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
20b20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b40 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
20b50 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
20b60 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
20b90 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
20ba0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
20bb0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
20bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
20bd0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
20be0 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
20bf0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
20c20 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
20c30 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
20c40 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
20c50 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
20c60 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
20c70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
20c80 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
20c90 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
20ca0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
20cb0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
20cc0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
20cd0 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
20ce0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
20cf0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
20d00 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
20d10 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
20d20 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
20d30 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
20d40 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
20d50 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
20d60 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
20d70 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
20d80 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
20d90 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
20da0 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
20db0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
20dc0 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
20dd0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
20de0 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
20df0 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
20e00 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
20e10 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
20e20 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
20e30 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
20e40 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
20e50 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
20e60 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
20e70 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
20e80 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 20  = szHdr1;.    i 
20e90 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  = 0;.  }.  if( d
20ea0 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  1>(unsigned)nKey
20eb0 31 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79 32  1 ){ .    pPKey2
20ec0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
20ed0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20ee0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
20ef0 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
20f00 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  n */.  }..  VVA_
20f10 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
20f20 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
20f30 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
20f40 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
20f50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
20f60 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
20f70 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65 79  nAllField>=pPKey
20f80 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
20f90 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
20fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
20fb0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
20fc0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
20fd0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
20fe0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79  ->pKeyInfo->nKey
20ff0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
21000 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
21010 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
21020 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
21030 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
21040 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20     /* RHS is an 
21050 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69  integer */.    i
21060 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
21070 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
21080 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
21090 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
210a0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
210b0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
210c0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
210d0 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
210e0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
210f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
21100 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
21110 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21120 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21130 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
21140 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21150 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
21160 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
21170 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
21180 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73  .        rc = -s
21190 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
211a0 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c  mpare(pRhs->u.i,
211b0 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20   mem1.u.r);.    
211c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
211d0 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
211e0 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
211f0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
21200 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
21210 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
21220 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
21230 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
21240 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
21250 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
21260 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
21270 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
21280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21290 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
212a0 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
212b0 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
212c0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
212d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
212e0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
212f0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
21300 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
21310 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
21320 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f  erial types 12 o
21330 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74  r greater are st
21340 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20  rings and blobs 
21350 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20  (greater than.  
21360 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73        ** numbers
21370 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20  ). Types 10 and 
21380 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  11 are currently
21390 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66   "reserved for f
213a0 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  uture .        *
213b0 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f  * use", so it do
213c0 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74  esn't really mat
213d0 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73  ter what the res
213e0 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e  ults of comparin
213f0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
21400 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61  m to numberic va
21410 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20  lues are.  */.  
21420 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
21430 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
21440 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
21450 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
21460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21480 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
21490 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
214a0 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
214b0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
214c0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
214d0 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e       if( mem1.u.
214e0 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20  r<pRhs->u.r ){. 
214f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21500 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  -1;.          }e
21510 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72  lse if( mem1.u.r
21520 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  >pRhs->u.r ){.  
21530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
21540 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
21550 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21560 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21570 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
21580 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52  are(mem1.u.i, pR
21590 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  hs->u.r);.      
215a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
215b0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
215c0 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20   a string */.   
215d0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
215e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
215f0 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
21600 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
21610 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
21620 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21630 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
21640 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
21650 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
21660 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
21670 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21680 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
21690 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
216a0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
216b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
216c0 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c  mem1.n = (serial
216d0 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
216e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
216f0 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d  e( (d1+mem1.n)==
21700 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
21710 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
21720 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b  ase( (d1+mem1.n+
21730 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
21740 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
21750 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e  f( (d1+mem1.n) >
21760 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
21770 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4b  .         || (pK
21780 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
21790 3e 70 4b 65 79 49 6e 66 6f 29 2d 3e 6e 41 6c 6c  >pKeyInfo)->nAll
217a0 46 69 65 6c 64 3c 3d 69 0a 20 20 20 20 20 20 20  Field<=i.       
217b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
217c0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
217d0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
217e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
217f0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
21810 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
21820 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
21830 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
21840 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ] ){.          m
21850 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
21860 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20  fo->enc;.       
21870 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65     mem1.db = pKe
21880 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20  yInfo->db;.     
21890 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20       mem1.flags 
218a0 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
218b0 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63       mem1.z = (c
218c0 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b  har*)&aKey1[d1];
218d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
218e0 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
218f0 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20  ring(.          
21900 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c      &mem1, pRhs,
21910 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
21920 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72  [i], &pPKey2->er
21930 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20  rCode.          
21940 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21950 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
21960 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e  nCmp = MIN(mem1.
21970 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  n, pRhs->n);.   
21980 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
21990 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
219a0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
219b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
219c0 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e  =0 ) rc = mem1.n
219d0 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20   - pRhs->n; .   
219e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
219f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
21a00 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
21a10 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
21a20 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
21a30 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
21a40 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 73 20  t( (pRhs->flags 
21a50 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
21a60 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a  | pRhs->n==0 );.
21a70 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
21a80 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
21a90 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
21aa0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
21ab0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
21ac0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
21ad0 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65  l_type<12 || (se
21ae0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
21af0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
21b00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
21b10 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
21b20 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
21b30 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
21b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21b50 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69  (d1+nStr)==(unsi
21b60 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
21b70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21b80 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e  (d1+nStr+1)==(un
21b90 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
21ba0 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
21bb0 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65  nStr) > (unsigne
21bc0 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
21bd0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
21be0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
21bf0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21c00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21c10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21c20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
21c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
21c40 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
21c50 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
21c60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69            if( !i
21c70 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20  sAllZero((const 
21c80 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
21c90 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20  ,nStr) ){.      
21ca0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
21cb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21cc0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21cd0 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e  nStr - pRhs->u.n
21ce0 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Zero;.          
21cf0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
21d00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
21d10 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
21d20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
21d30 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
21d40 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
21d50 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
21d60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
21d70 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
21d80 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
21d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21da0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
21db0 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
21dc0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
21dd0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
21de0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
21df0 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
21e00 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
21e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
21e20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
21e30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
21e40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21e50 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
21e60 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
21e70 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
21e80 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
21e90 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
21ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
21eb0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
21ec0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
21ed0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
21ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
21ef0 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69  ..    i++;.    i
21f00 66 28 20 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46  f( i==pPKey2->nF
21f10 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
21f20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31    pRhs++;.    d1
21f30 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
21f40 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
21f50 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
21f60 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  dx1 += sqlite3Va
21f70 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
21f80 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
21f90 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73  idx1<(unsigned)s
21fa0 7a 48 64 72 31 20 26 26 20 64 31 3c 3d 28 75 6e  zHdr1 && d1<=(un
21fb0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
21fc0 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
21fd0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
21fe0 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
21ff0 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
22000 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
22010 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
22020 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
22030 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
22040 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
22050 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
22060 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
22070 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
22080 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61  (&mem1).  */.  a
22090 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
220a0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
220b0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
220c0 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f  s that one or bo
220d0 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  th of the keys r
220e0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
220f0 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
22100 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
22110 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
22120 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
22130 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
22140 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73   value.  */.  as
22150 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
22160 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65   .       || vdbe
22170 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
22180 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
22190 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d   pPKey2, pPKey2-
221a0 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20  >default_rc) .  
221b0 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
221c0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
221d0 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
221e0 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
221f0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 1;.  return p
22200 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
22210 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
22220 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22230 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
22240 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
22250 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
22260 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
22270 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
22280 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
22290 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  ey */.){.  retur
222a0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
222b0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
222c0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
222d0 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a   pPKey2, 0);.}..
222e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
222f0 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
22300 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
22310 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22320 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
22330 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
22340 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
22350 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  2 is an integer,
22360 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a   and (b) the .**
22370 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
22380 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74  varint at the st
22390 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
223a0 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
223b0 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69  ingle.** byte (i
223c0 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .e. is less than
223d0 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   128)..**.** To 
223e0 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61  avoid concerns a
223f0 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72  bout buffer over
22400 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74  reads, this rout
22410 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
22420 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77  .** on schemas w
22430 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  here the maximum
22440 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69   valid header si
22450 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f  ze is 63 bytes o
22460 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  r less..*/.stati
22470 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
22480 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e  CompareInt(.  in
22490 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
224a0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
224b0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
224c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
224d0 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
224e0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
224f0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d  const u8 *aKey =
22500 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   &((const u8*)pK
22510 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a  ey1)[*(const u8*
22520 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a  )pKey1 & 0x3F];.
22530 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
22540 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29  e = ((const u8*)
22550 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74  pKey1)[1];.  int
22560 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20   res;.  u32 y;. 
22570 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b   u64 x;.  i64 v;
22580 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76  .  i64 lhs;..  v
22590 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
225a0 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
225b0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
225c0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  Key2->pKeyInfo);
225d0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38  .  assert( (*(u8
225e0 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c  *)pKey1)<=0x3F |
225f0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
22600 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
22610 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
22620 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
22630 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
22640 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f  */.      lhs = O
22650 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
22660 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22670 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
22680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
22690 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
226a0 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
226b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
226c0 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  hs = TWO_BYTE_IN
226d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
226e0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
226f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
22710 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
22720 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
22730 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45       lhs = THREE
22740 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
22750 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22760 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
22770 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22780 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
22790 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
227a0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d  ger */.      y =
227b0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
227c0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73  aKey);.      lhs
227d0 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26   = (i64)*(int*)&
227e0 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  y;.      testcas
227f0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
22800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
22810 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
22820 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
22830 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
22840 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  hs = FOUR_BYTE_U
22850 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28  INT(aKey+2) + ((
22860 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
22870 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
22880 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22890 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
228a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
228b0 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d   case 6: { /* 8-
228c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
228d0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d  ger */.      x =
228e0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
228f0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d  aKey);.      x =
22900 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
22910 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
22920 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a  );.      lhs = *
22930 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
22940 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
22950 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
22960 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
22970 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30  : .      lhs = 0
22980 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
22990 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20     case 9:.     
229a0 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20   lhs = 1;.      
229b0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54  break;..    /* T
229c0 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62  his case could b
229d0 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75  e removed withou
229e0 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72  t changing the r
229f0 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e  esults of runnin
22a00 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  g.    ** this co
22a10 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74  de. Including it
22a20 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67   causes gcc to g
22a30 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72  enerate a faster
22a40 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20   switch .    ** 
22a50 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65  statement (since
22a60 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77   the range of sw
22a70 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77  itch targets now
22a80 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20   starts at zero 
22a90 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f  and.    ** is co
22aa0 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f  ntiguous) but do
22ab0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
22ac0 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20   duplicate code 
22ad0 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  to be generated.
22ae0 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69      ** (as gcc i
22af0 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20  s clever enough 
22b00 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74  to combine the t
22b10 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20  wo like cases). 
22b20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  Other .    ** co
22b30 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65  mpilers might be
22b40 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20   similar.  */ . 
22b50 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20     case 0: case 
22b60 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  7:.      return 
22b70 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22b80 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
22b90 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
22ba0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
22bb0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
22bc0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
22bd0 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
22be0 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a  , pPKey2);.  }..
22bf0 20 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d    v = pPKey2->aM
22c00 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28  em[0].u.i;.  if(
22c10 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
22c20 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
22c30 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
22c40 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
22c50 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
22c60 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
22c70 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
22c80 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
22c90 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
22ca0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
22cb0 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
22cc0 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
22cd0 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
22ce0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22cf0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
22d00 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
22d10 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65  pPKey2, 1);.  }e
22d20 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
22d30 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
22d40 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
22d50 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65   equal and there
22d60 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67   are no trailing
22d70 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
22d80 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  Return pPKey2->d
22d90 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69  efault_rc in thi
22da0 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  s case. */.    r
22db0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
22dc0 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b  ault_rc;.    pPK
22dd0 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
22de0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
22df0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
22e00 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
22e10 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
22e20 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ) );.  return re
22e30 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
22e40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
22e50 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
22e60 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
22e70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
22e80 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
22e90 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
22ea0 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
22eb0 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
22ec0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
22ed0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
22ee0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
22ef0 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
22f00 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
22f10 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
22f20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
22f30 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
22f40 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
22f50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22f60 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22f70 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
22f80 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
22f90 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
22fa0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
22fb0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
22fc0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
22fd0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
22fe0 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20  nst u8 *aKey1 = 
22ff0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
23000 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
23010 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ype;.  int res;.
23020 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
23030 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  2->aMem[0].flags
23040 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
23050 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
23060 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
23070 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
23080 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
23090 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28  ;.  getVarint32(
230a0 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61  &aKey1[1], seria
230b0 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73  l_type);.  if( s
230c0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
230d0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
230e0 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28  2->r1;      /* (
230f0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
23100 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75  a number or a nu
23110 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ll */.  }else if
23120 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
23130 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20  & 0x01) ){ .    
23140 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
23150 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
23160 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f  /nKey1) is a blo
23170 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b */.  }else{.  
23180 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
23190 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e  int nStr;.    in
231a0 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b  t szHdr = aKey1[
231b0 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20  0];..    nStr = 
231c0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
231d0 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73   / 2;.    if( (s
231e0 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e  zHdr + nStr) > n
231f0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50  Key1 ){.      pP
23200 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
23210 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
23220 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
23230 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43  eturn 0;    /* C
23240 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
23250 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49   }.    nCmp = MI
23260 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  N( pPKey2->aMem[
23270 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20  0].n, nStr );.  
23280 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26    res = memcmp(&
23290 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50  aKey1[szHdr], pP
232a0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c  Key2->aMem[0].z,
232b0 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28   nCmp);..    if(
232c0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
232d0 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50   res = nStr - pP
232e0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b  Key2->aMem[0].n;
232f0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
23300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
23310 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
23320 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
23330 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
23340 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
23350 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
23360 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
23370 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23380 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70           res = p
23390 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
233a0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  c;.          pPK
233b0 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
233c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
233d0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
233e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
233f0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
23400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23410 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
23420 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
23430 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
23440 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
23450 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
23460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
23470 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
23480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
23490 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
234a0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
234b0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
234c0 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20   res).       || 
234d0 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20  CORRUPT_DB.     
234e0 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
234f0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
23500 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
23510 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
23520 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
23530 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
23540 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23550 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65  are() compatible
23560 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69   function.** sui
23570 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72  table for compar
23580 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72  ing serialized r
23590 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e  ecords to the un
235a0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61  packed record pa
235b0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
235c0 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
235d0 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73  .RecordCompare s
235e0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
235f0 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65  mpare(UnpackedRe
23600 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76  cord *p){.  /* v
23610 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
23620 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69  reInt() and vari
23630 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  ntRecordCompareS
23640 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73  tring() both ass
23650 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ume.  ** that th
23660 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
23670 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63   varint that occ
23680 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74  urs at the start
23690 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a   of each record.
236a0 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73    ** fits in a s
236b0 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e  ingle byte (i.e.
236c0 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29   is 127 or less)
236d0 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  . varintRecordCo
236e0 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20  mpareInt().  ** 
236f0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
23700 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
23710 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65  overread a buffe
23720 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68  r by at least th
23730 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  e .  ** maximum 
23740 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68  possible legal h
23750 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20  eader size plus 
23760 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65  8 bytes. Because
23770 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67   there is.  ** g
23780 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
23790 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74  at least 74 (but
237a0 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20   not 136) bytes 
237b0 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f  of padding follo
237c0 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62  wing each.  ** b
237d0 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
237e0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
237f0 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61  areInt() this ma
23800 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e  kes it convenien
23810 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20  t to.  ** limit 
23820 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
23830 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74  header to 64 byt
23840 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  es in cases wher
23850 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  e the first fiel
23860 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  d.  ** is an int
23870 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger..  **.  ** 
23880 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  The easiest way 
23890 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
238a0 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73  limit is to cons
238b0 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64  ider only record
238c0 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66  s with.  ** 13 f
238d0 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49  ields or less. I
238e0 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  f the first fiel
238f0 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  d is an integer,
23900 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   the maximum leg
23910 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73  al.  ** header s
23920 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31  ize is (12*5 + 1
23930 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f   + 1) bytes.  */
23940 0a 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e  .  if( p->pKeyIn
23950 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31  fo->nAllField<=1
23960 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
23970 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
23980 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
23990 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
239a0 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
239b0 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
239c0 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
239d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
239e0 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
239f0 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
23a00 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
23a10 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
23a20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
23a30 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
23a40 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
23a50 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
23a60 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
23a70 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
23a80 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
23a90 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
23aa0 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
23ab0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
23ac0 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
23ad0 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
23ae0 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
23af0 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
23b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
23b10 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
23b20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
23b30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
23b40 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
23b50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
23b60 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23b70 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
23b80 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
23b90 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
23ba0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
23bb0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
23bc0 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
23bd0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
23be0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
23bf0 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
23c00 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
23c10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
23c20 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
23c30 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
23c40 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
23c50 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
23c60 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
23c70 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
23c80 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
23c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
23ca0 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
23cb0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
23cc0 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
23cd0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
23ce0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
23cf0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
23d00 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
23d10 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
23d20 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
23d30 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
23d40 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
23d50 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
23d60 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
23d70 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
23d80 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
23d90 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
23da0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
23db0 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
23dc0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
23dd0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
23de0 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  m, v;..  /* Get 
23df0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
23e00 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
23e10 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
23e20 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
23e30 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
23e40 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
23e50 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
23e60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
23e70 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
23e80 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
23e90 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
23ea0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
23eb0 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
23ec0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
23ed0 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
23ee0 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
23ef0 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
23f00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23f10 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
23f20 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43  id(pCur) );.  nC
23f30 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
23f40 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
23f50 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74  (pCur);.  assert
23f60 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
23f70 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
23f80 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
23f90 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
23fa0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
23fb0 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
23fc0 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
23fd0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
23fe0 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
23ff0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
24000 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
24010 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
24020 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
24030 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
24040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
24050 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
24060 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
24070 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
24080 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
24090 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
240a0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
240b0 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
240c0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
240d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
240e0 73 7a 48 64 72 3e 30 78 37 66 66 66 66 66 66 66  szHdr>0x7fffffff
240f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 2e   );.  assert( m.
24100 6e 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 75 6e  n>=0 );.  if( un
24110 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
24120 7c 20 73 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65  | szHdr>(unsigne
24130 64 29 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  d)m.n) ){.    go
24140 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
24150 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
24160 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
24170 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
24180 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
24190 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
241a0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
241b0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
241c0 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
241d0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
241e0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
241f0 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
24200 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
24210 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
24220 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
24230 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
24240 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
24250 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
24260 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
24270 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
24280 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
24290 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
242a0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
242b0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
242c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
242d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
242e0 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
242f0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
24300 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
24310 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
24320 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
24330 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
24340 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
24350 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
24360 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
24370 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
24380 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
24390 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
243a0 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
243b0 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
243c0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
243d0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
243e0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
243f0 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
24400 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
24410 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
24420 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
24430 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
24440 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
24450 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
24460 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
24470 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
24480 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
24490 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
244a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
244b0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
244c0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
244d0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
244e0 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
244f0 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
24500 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
24510 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
24520 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24530 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
24540 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
24550 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
24560 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
24570 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
24580 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
24590 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
245a0 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
245b0 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
245c0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
245d0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
245e0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
245f0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
24600 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
24610 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
24620 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
24630 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
24640 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
24650 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
24660 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
24670 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
24680 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
24690 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
246a0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
246b0 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
246c0 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
246d0 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
246e0 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
246f0 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
24700 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
24710 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
24720 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
24730 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
24740 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
24750 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
24760 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
24770 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
24780 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
24790 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
247a0 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
247b0 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
247c0 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
247d0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
247e0 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
247f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
24820 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
24830 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24850 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
24860 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
24870 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
24880 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
24890 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
248a0 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
248b0 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
248e0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
248f0 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
24900 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
24910 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
24920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
24930 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
24940 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
24950 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
24960 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
24970 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
24980 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
24990 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
249a0 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
249b0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
249c0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
249d0 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  ur);.  /* nCellK
249e0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
249f0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
24a00 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
24a10 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
24a20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
24a30 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
24a40 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
24a50 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
24a60 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
24a70 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
24a80 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
24a90 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
24aa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24ab0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
24ac0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
24ad0 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
24ae0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
24af0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
24b00 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
24b10 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
24b20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24b30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24b40 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
24b50 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
24b60 61 72 65 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c  areWithSkip(m.n,
24b70 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c   m.z, pUnpacked,
24b80 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
24b90 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
24ba0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24bb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
24bc0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
24bd0 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
24be0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
24bf0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
24c00 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
24c10 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
24c20 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
24c30 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
24c40 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
24c50 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
24c60 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
24c70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24c80 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
24c90 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
24ca0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
24cb0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
24cc0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
24cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
24ce0 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
24cf0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
24d00 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
24d10 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
24d20 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
24d30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
24d40 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
24d50 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
24d60 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
24d70 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
24d80 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
24d90 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
24da0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
24db0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
24dc0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
24dd0 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
24de0 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
24df0 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
24e00 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
24e10 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
24e20 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
24e30 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
24e40 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
24e50 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
24e60 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
24e70 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
24e80 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
24e90 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
24ea0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
24eb0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
24ec0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
24ed0 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
24ee0 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
24ef0 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
24f00 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
24f10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65  ..**.** If iCode
24f20 20 69 73 20 31 2c 20 74 68 65 6e 20 65 78 70 69   is 1, then expi
24f30 72 61 74 69 6f 6e 20 69 73 20 61 64 76 69 73 6f  ration is adviso
24f40 72 79 2e 20 20 54 68 65 20 73 74 61 74 65 6d 65  ry.  The stateme
24f50 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
24f60 72 65 70 72 65 70 61 72 65 64 20 62 65 66 6f 72  reprepared befor
24f70 65 20 62 65 69 6e 67 20 72 65 73 74 61 72 74 65  e being restarte
24f80 64 2c 20 62 75 74 20 69 66 20 69 74 20 69 73 20  d, but if it is 
24f90 61 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a  already running.
24fa0 2a 2a 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64  ** it is allowed
24fb0 20 74 6f 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c   to run to compl
24fc0 65 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74  etion..**.** Int
24fd0 65 72 6e 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  ernally, this fu
24fe0 6e 63 74 69 6f 6e 20 6a 75 73 74 20 73 65 74 73  nction just sets
24ff0 20 74 68 65 20 56 64 62 65 2e 65 78 70 69 72 65   the Vdbe.expire
25000 64 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a  d flag on all.**
25010 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
25020 65 6e 74 73 2e 20 20 54 68 65 20 66 6c 61 67 20  ents.  The flag 
25030 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72 20  is set to 1 for 
25040 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 65 78 70  an immediate exp
25050 69 72 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73  iration.** and s
25060 65 74 20 74 6f 20 32 20 66 6f 72 20 61 6e 20 61  et to 2 for an a
25070 64 76 69 73 6f 72 79 20 65 78 70 69 72 61 74 69  dvisory expirati
25080 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
25090 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
250a0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
250b0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f  te3 *db, int iCo
250c0 64 65 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  de){.  Vdbe *p;.
250d0 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
250e0 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
250f0 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
25100 72 65 64 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20  red = iCode+1;. 
25110 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
25120 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
25130 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25140 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
25150 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
25160 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
25170 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
25180 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25190 65 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45  e SQLITE_PREPARE
251a0 20 66 6c 61 67 73 20 66 6f 72 20 61 20 56 64 62   flags for a Vdb
251b0 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33  e..*/.u8 sqlite3
251c0 56 64 62 65 50 72 65 70 61 72 65 46 6c 61 67 73  VdbePrepareFlags
251d0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
251e0 75 72 6e 20 76 2d 3e 70 72 65 70 46 6c 61 67 73  urn v->prepFlags
251f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25200 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
25210 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
25220 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
25230 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
25240 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
25250 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
25260 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
25270 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
25280 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
25290 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
252a0 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
252b0 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
252c0 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
252d0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
252e0 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
252f0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
25300 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
25310 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
25320 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
25330 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
25340 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
25350 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
25360 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
25370 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
25380 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
25390 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
253a0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
253b0 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
253c0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
253d0 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
253e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 76 2d  .    assert( (v-
253f0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
25400 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d  ITE_EnableQPSG)=
25410 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =0 );.    if( 0=
25420 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  =(pMem->flags & 
25430 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20  MEM_Null) ){.   
25440 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
25450 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
25460 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b  ValueNew(v->db);
25470 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
25480 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25490 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
254a0 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29  em *)pRet, pMem)
254b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
254c0 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
254d0 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53  ity(pRet, aff, S
254e0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
254f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
25500 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20  n pRet;.    }.  
25510 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
25520 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
25530 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56   SQL variable iV
25540 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69  ar so that bindi
25550 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74  ng a new value t
25560 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20  o it signals.** 
25570 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74  to sqlite3_reopt
25580 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d  imize() that re-
25590 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
255a0 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75  atement may resu
255b0 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65  lt.** in a bette
255c0 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f  r query plan..*/
255d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
255e0 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65  eSetVarmask(Vdbe
255f0 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a   *v, int iVar){.
25600 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
25610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 76   );.  assert( (v
25620 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
25630 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 29  LITE_EnableQPSG)
25640 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  ==0 );.  if( iVa
25650 72 3e 3d 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  r>=32 ){.    v->
25660 65 78 70 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30  expmask |= 0x800
25670 30 30 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  00000;.  }else{.
25680 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c      v->expmask |
25690 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56  = ((u32)1 << (iV
256a0 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ar-1));.  }.}../
256b0 2a 0a 2a 2a 20 43 61 75 73 65 20 61 20 66 75 6e  *.** Cause a fun
256c0 63 74 69 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61  ction to throw a
256d0 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 77 61  n error if it wa
256e0 73 20 63 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50  s call from OP_P
256f0 75 72 65 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65  ureFunc.** rathe
25700 72 20 74 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69  r than OP_Functi
25710 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72  on..**.** OP_Pur
25720 65 46 75 6e 63 20 6d 65 61 6e 73 20 74 68 61 74  eFunc means that
25730 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75   the function mu
25740 73 74 20 62 65 20 64 65 74 65 72 6d 69 6e 69 73  st be determinis
25750 74 69 63 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a  tic, and should.
25760 2a 2a 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  ** throw an erro
25770 72 20 69 66 20 69 74 20 69 73 20 67 69 76 65 6e  r if it is given
25780 20 69 6e 70 75 74 73 20 74 68 61 74 20 77 6f 75   inputs that wou
25790 6c 64 20 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64  ld make it non-d
257a0 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a  eterministic..**
257b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
257c0 20 69 6e 76 6f 6b 65 64 20 62 79 20 64 61 74 65   invoked by date
257d0 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20  /time functions 
257e0 74 68 61 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74  that use non-det
257f0 65 72 6d 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65  erministic.** fe
25800 61 74 75 72 65 73 20 73 75 63 68 20 61 73 20 27  atures such as '
25810 6e 6f 77 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  now'..*/.int sql
25820 69 74 65 33 4e 6f 74 50 75 72 65 46 75 6e 63 28  ite3NotPureFunc(
25830 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
25840 2a 70 43 74 78 29 7b 0a 23 69 66 64 65 66 20 53  *pCtx){.#ifdef S
25850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
25860 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 69 66  T3_OR_STAT4.  if
25870 28 20 70 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30  ( pCtx->pVdbe==0
25880 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e   ) return 1;.#en
25890 64 69 66 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  dif.  if( pCtx->
258a0 70 56 64 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d  pVdbe->aOp[pCtx-
258b0 3e 69 4f 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  >iOp].opcode==OP
258c0 5f 50 75 72 65 46 75 6e 63 20 29 7b 0a 20 20 20  _PureFunc ){.   
258d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
258e0 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
258f0 20 20 20 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69      "non-determi
25900 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20  nistic function 
25910 69 6e 20 69 6e 64 65 78 20 65 78 70 72 65 73 73  in index express
25920 69 6f 6e 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e  ion or CHECK con
25930 73 74 72 61 69 6e 74 22 2c 0a 20 20 20 20 20 20  straint",.      
25940 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
25950 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25960 20 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   1;.}..#ifndef S
25970 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
25980 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
25990 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
259a0 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
259b0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
259c0 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
259d0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
259e0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
259f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
25a00 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
25a10 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
25a20 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
25a30 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
25a40 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
25a50 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
25a60 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
25a70 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
25a80 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66  ab *pVtab){.  if
25a90 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  ( pVtab->zErrMsg
25aa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
25ab0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
25ac0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
25ad0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
25ae0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
25af0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
25b00 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
25b10 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
25b20 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
25b30 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61  rrMsg);.    pVta
25b40 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
25b50 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
25b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
25b70 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
25b80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25b90 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
25ba0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
25bb0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
25bc0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65  s not NULL, rele
25bd0 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69  ase any allocati
25be0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ons associated .
25bf0 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f  ** with the memo
25c00 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ry cells in the 
25c10 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e  p->aMem[] array.
25c20 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55   Also free the U
25c30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
25c40 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
25c50 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  f, using sqlite3
25c60 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  DbFree()..**.** 
25c70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25c80 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e   used to free Un
25c90 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
25ca0 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65  uctures allocate
25cb0 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65  d by.** the vdbe
25cc0 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66  UnpackRecord() f
25cd0 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e  unction found in
25ce0 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73   vdbeapi.c..*/.s
25cf0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
25d00 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69  reeUnpacked(sqli
25d10 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69  te3 *db, int nFi
25d20 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  eld, UnpackedRec
25d30 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
25d40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
25d50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
25d60 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
25d70 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
25d80 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20  ->aMem[i];.     
25d90 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c   if( pMem->zMall
25da0 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  oc ) sqlite3Vdbe
25db0 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
25dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25dd0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
25de0 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
25df0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
25e00 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
25e10 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
25e20 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
25e30 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49  ATE_HOOK./*.** I
25e40 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
25e50 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
25e60 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
25e70 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70  or DELETE pre-up
25e80 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68  date call,.** th
25e90 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  en cursor passed
25ea0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25eb0 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70  rgument should p
25ec0 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20  oint to the row 
25ed0 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75  about.** to be u
25ee0 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64  pdate or deleted
25ef0 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  . If the applica
25f00 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
25f10 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
25f20 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69  (),.** the requi
25f30 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  red value will b
25f40 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
25f50 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70  row the cursor p
25f60 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69  oints to..*/.voi
25f70 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  d sqlite3VdbePre
25f80 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64  UpdateHook(.  Vd
25f90 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fb0 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65   Vdbe pre-update
25fc0 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64   hook is invoked
25fd0 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72   by */.  VdbeCur
25fe0 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
25ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
26000 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a  or to grab old.*
26010 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a   values from */.
26020 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45    /* SQLITE_INSE
26050 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
26060 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  LETE */.  const 
26070 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
26080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
26090 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
260a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c  /* Modified tabl
260d0 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31  e */.  i64 iKey1
260e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
260f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
26100 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  l key value */. 
26110 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
26140 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f   new.* record */
26150 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26160 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34  b = v->db;.  i64
26170 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64   iKey2;.  PreUpd
26180 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20  ate preupdate;. 
26190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
261a0 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  l = pTab->zName;
261b0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
261c0 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  u8 fakeSortOrder
261d0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
261e0 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d   db->pPreUpdate=
261f0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
26200 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69  preupdate, 0, si
26210 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29  zeof(PreUpdate))
26220 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64  ;.  if( HasRowid
26230 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20  (pTab)==0 ){.   
26240 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d   iKey1 = iKey2 =
26250 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74   0;.    preupdat
26260 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50  e.pPk = sqlite3P
26270 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
26280 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Tab);.  }else{. 
26290 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
262a0 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  E_UPDATE ){.    
262b0 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65    iKey2 = v->aMe
262c0 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20  m[iReg].u.i;.   
262d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b   }else{.      iK
262e0 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20  ey2 = iKey1;.   
262f0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
26300 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d  ( pCsr->nField==
26310 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20  pTab->nCol .    
26320 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69     || (pCsr->nFi
26330 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b  eld==pTab->nCol+
26340 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  1 && op==SQLITE_
26350 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d  DELETE && iReg==
26360 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75  -1).  );..  preu
26370 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70  pdate.v = v;.  p
26380 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20  reupdate.pCsr = 
26390 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74  pCsr;.  preupdat
263a0 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65  e.op = op;.  pre
263b0 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d  update.iNewReg =
263c0 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61   iReg;.  preupda
263d0 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20  te.keyinfo.db = 
263e0 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  db;.  preupdate.
263f0 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e  keyinfo.enc = EN
26400 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61  C(db);.  preupda
26410 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46  te.keyinfo.nKeyF
26420 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  ield = pTab->nCo
26430 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  l;.  preupdate.k
26440 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65  eyinfo.aSortOrde
26450 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f  r = (u8*)&fakeSo
26460 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70  rtOrder;.  preup
26470 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65  date.iKey1 = iKe
26480 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  y1;.  preupdate.
26490 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20  iKey2 = iKey2;. 
264a0 20 70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20   preupdate.pTab 
264b0 3d 20 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70  = pTab;..  db->p
264c0 50 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65  PreUpdate = &pre
264d0 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50  update;.  db->xP
264e0 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  reUpdateCallback
264f0 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41  (db->pPreUpdateA
26500 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c  rg, db, op, zDb,
26510 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b   zTbl, iKey1, iK
26520 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65  ey2);.  db->pPre
26530 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71  Update = 0;.  sq
26540 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
26550 70 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72  preupdate.aRecor
26560 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
26570 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
26580 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65  date.keyinfo.nKe
26590 79 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70 64  yField+1, preupd
265a0 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a  ate.pUnpacked);.
265b0 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b    vdbeFreeUnpack
265c0 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ed(db, preupdate
265d0 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65  .keyinfo.nKeyFie
265e0 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e  ld+1, preupdate.
265f0 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20  pNewUnpacked);. 
26600 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61   if( preupdate.a
26610 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
26620 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
26630 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69  <pCsr->nField; i
26640 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
26650 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
26660 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  (&preupdate.aNew
26670 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
26680 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
26690 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e  db, preupdate.aN
266a0 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ew);.  }.}.#endi
266b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
266c0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
266d0 4b 20 2a 2f 0a                                   K */.