/ Hex Artifact Content
Login

Artifact d444f4a3ff9c571965329a186701a57fe445e4c3f4c42f87402aca75386ba358:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
0440: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0450: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0460: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0480: 32 28 70 2c 20 4f 50 5f 49 6e 69 74 2c 20 30 2c  2(p, OP_Init, 0,
0490: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
04a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
04b0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e   the error strin
04c0: 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65  g stored in Vdbe
04d0: 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64  .zErrMsg.*/.void
04e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
04f0: 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  r(Vdbe *p, const
0500: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0510: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
0520: 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ap;.  sqlite3DbF
0530: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45  ree(p->db, p->zE
0540: 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61  rrMsg);.  va_sta
0550: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
0570: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
0580: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
0590: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
05a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  );.}../*.** Reme
05b0: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
05c0: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
05d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
05e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05f0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
0600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
0610: 69 6e 74 20 6e 2c 20 75 38 20 70 72 65 70 46 6c  int n, u8 prepFl
0620: 61 67 73 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  ags){.  if( p==0
0630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
0640: 70 72 65 70 46 6c 61 67 73 20 3d 20 70 72 65 70  prepFlags = prep
0650: 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 72  Flags;.  if( (pr
0660: 65 70 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  epFlags & SQLITE
0670: 5f 50 52 45 50 41 52 45 5f 53 41 56 45 53 51 4c  _PREPARE_SAVESQL
0680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 65  )==0 ){.    p->e
0690: 78 70 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 0a  xpmask = 0;.  }.
06a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
06b0: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
06c0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
06d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
06e0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
06f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41  ITE_ENABLE_NORMA
0700: 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  LIZE./*.** Add a
0710: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
0720: 74 68 65 20 56 64 62 65 2d 3e 70 44 62 6c 53 74  the Vdbe->pDblSt
0730: 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r list..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 44 62  sqlite3VdbeAddDb
0750: 6c 71 75 6f 74 65 53 74 72 28 73 71 6c 69 74 65  lquoteStr(sqlite
0760: 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 2c 20  3 *db, Vdbe *p, 
0770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0780: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
0790: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
07a0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 44  rlen30(z);.    D
07b0: 62 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72  blquoteStr *pStr
07c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
07d0: 6f 63 52 61 77 4e 4e 28 64 62 2c 0a 20 20 20 20  ocRawNN(db,.    
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
0800: 70 53 74 72 29 2b 6e 2b 31 2d 73 69 7a 65 6f 66  pStr)+n+1-sizeof
0810: 28 70 53 74 72 2d 3e 7a 29 29 3b 0a 20 20 20 20  (pStr->z));.    
0820: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
0830: 20 20 70 53 74 72 2d 3e 70 4e 65 78 74 53 74 72    pStr->pNextStr
0840: 20 3d 20 70 2d 3e 70 44 62 6c 53 74 72 3b 0a 20   = p->pDblStr;. 
0850: 20 20 20 20 20 70 2d 3e 70 44 62 6c 53 74 72 20       p->pDblStr 
0860: 3d 20 70 53 74 72 3b 0a 20 20 20 20 20 20 6d 65  = pStr;.      me
0870: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
0880: 20 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   n+1);.    }.  }
0890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
08a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
08b0: 4e 4f 52 4d 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20  NORMALIZE./*.** 
08c0: 7a 49 64 20 6f 66 20 6c 65 6e 67 74 68 20 6e 49  zId of length nI
08d0: 64 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  d is a double-qu
08e0: 6f 74 65 64 20 69 64 65 6e 74 69 66 69 65 72 2e  oted identifier.
08f0: 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
0900: 66 0a 2a 2a 20 74 68 61 74 20 69 64 65 6e 74 69  f.** that identi
0910: 66 69 65 72 20 69 73 20 72 65 61 6c 6c 79 20 75  fier is really u
0920: 73 65 64 20 61 73 20 61 20 73 74 72 69 6e 67 20  sed as a string 
0930: 6c 69 74 65 72 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  literal..*/.int 
0940: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 44  sqlite3VdbeUsesD
0950: 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e  oubleQuotedStrin
0960: 67 28 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  g(.  Vdbe *pVdbe
0970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
0980: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
0990: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  tement */.  cons
09a0: 74 20 63 68 61 72 20 2a 7a 49 64 20 20 20 20 20  t char *zId     
09b0: 20 20 20 20 2f 2a 20 54 68 65 20 64 6f 75 62 6c      /* The doubl
09c0: 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66  e-quoted identif
09d0: 69 65 72 2c 20 61 6c 72 65 61 64 79 20 64 65 71  ier, already deq
09e0: 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 44 62  uoted */.){.  Db
09f0: 6c 71 75 6f 74 65 53 74 72 20 2a 70 53 74 72 3b  lquoteStr *pStr;
0a00: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 64 21 3d  .  assert( zId!=
0a10: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 64 62 65  0 );.  if( pVdbe
0a20: 2d 3e 70 44 62 6c 53 74 72 3d 3d 30 20 29 20 72  ->pDblStr==0 ) r
0a30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
0a40: 53 74 72 3d 70 56 64 62 65 2d 3e 70 44 62 6c 53  Str=pVdbe->pDblS
0a50: 74 72 3b 20 70 53 74 72 3b 20 70 53 74 72 3d 70  tr; pStr; pStr=p
0a60: 53 74 72 2d 3e 70 4e 65 78 74 53 74 72 29 7b 0a  Str->pNextStr){.
0a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
0a80: 49 64 2c 20 70 53 74 72 2d 3e 7a 29 3d 3d 30 20  Id, pStr->z)==0 
0a90: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
0aa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
0ab0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  ndif../*.** Swap
0ac0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
0ad0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
0ae0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0af0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0b00: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0b10: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0b20: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0b30: 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74   *zTmp;.  assert
0b40: 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62  ( pA->db==pB->db
0b50: 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b   );.  tmp = *pA;
0b60: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0b70: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0b80: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0b90: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
0ba0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
0bb0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
0bc0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
0bd0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
0be0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
0bf0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0c00: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0c10: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0c20: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0c30: 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 20 30 0a  l = zTmp;.#if 0.
0c40: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 4e 6f    zTmp = pA->zNo
0c50: 72 6d 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 4e 6f  rmSql;.  pA->zNo
0c60: 72 6d 53 71 6c 20 3d 20 70 42 2d 3e 7a 4e 6f 72  rmSql = pB->zNor
0c70: 6d 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 4e 6f 72  mSql;.  pB->zNor
0c80: 6d 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 65 6e  mSql = zTmp;.#en
0c90: 64 69 66 0a 20 20 70 42 2d 3e 65 78 70 6d 61 73  dif.  pB->expmas
0ca0: 6b 20 3d 20 70 41 2d 3e 65 78 70 6d 61 73 6b 3b  k = pA->expmask;
0cb0: 0a 20 20 70 42 2d 3e 70 72 65 70 46 6c 61 67 73  .  pB->prepFlags
0cc0: 20 3d 20 70 41 2d 3e 70 72 65 70 46 6c 61 67 73   = pA->prepFlags
0cd0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 2d 3e 61  ;.  memcpy(pB->a
0ce0: 43 6f 75 6e 74 65 72 2c 20 70 41 2d 3e 61 43 6f  Counter, pA->aCo
0cf0: 75 6e 74 65 72 2c 20 73 69 7a 65 6f 66 28 70 42  unter, sizeof(pB
0d00: 2d 3e 61 43 6f 75 6e 74 65 72 29 29 3b 0a 20 20  ->aCounter));.  
0d10: 70 42 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c  pB->aCounter[SQL
0d20: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
0d30: 45 50 52 45 50 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a  EPREPARE]++;.}..
0d40: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0d50: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0d60: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0d70: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
0d80: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0d90: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0da0: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0db0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0dc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0dd0: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0de0: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0df0: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0e00: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0e10: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0e20: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
0e30: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
0e40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
0e50: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0e60: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0e70: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0e80: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0e90: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0ea0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0eb0: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0ec0: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0ed0: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0ee0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0f00: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0f10: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0f20: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0f30: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0f40: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0f50: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0f60: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0f70: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0f80: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0f90: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0fa0: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0fb0: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0fc0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0fd0: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0fe0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0ff0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
1000: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
1010: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
1020: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
1030: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
1040: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
1050: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
1060: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
1070: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
1080: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
1090: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
10a0: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
10b0: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
10c0: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
10d0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
10e0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
10f0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
1100: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
1110: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
1120: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
1130: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
1140: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
1150: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
1160: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
1170: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
1180: 4e 65 77 20 3d 20 28 76 2d 3e 6e 4f 70 41 6c 6c  New = (v->nOpAll
1190: 6f 63 3e 3d 35 31 32 20 3f 20 32 2a 28 73 71 6c  oc>=512 ? 2*(sql
11a0: 69 74 65 33 5f 69 6e 74 36 34 29 76 2d 3e 6e 4f  ite3_int64)v->nO
11b0: 70 41 6c 6c 6f 63 0a 20 20 20 20 20 20 20 20 20  pAlloc.         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
11d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
11e0: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  v->nOpAlloc+nOp)
11f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
1200: 33 5f 69 6e 74 36 34 20 6e 4e 65 77 20 3d 20 28  3_int64 nNew = (
1210: 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 32 2a  v->nOpAlloc ? 2*
1220: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 76  (sqlite3_int64)v
1230: 2d 3e 6e 4f 70 41 6c 6c 6f 63 0a 20 20 20 20 20  ->nOpAlloc.     
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 3a 20 28 73 71 6c 69 74 65 33 5f 69 6e     : (sqlite3_in
1260: 74 36 34 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  t64)(1024/sizeof
1270: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
1280: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
1290: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
12a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
12b0: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
12c0: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
12d0: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
12e0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
12f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1300: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
1310: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1320: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
1330: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1340: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1350: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1360: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1370: 72 74 28 20 6e 4e 65 77 3e 3d 28 76 2d 3e 6e 4f  rt( nNew>=(v->nO
1380: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1390: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
13a0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
13b0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
13c0: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
13d0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
13e0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
13f0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
1400: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
1410: 20 76 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   v->nOpAlloc = p
1420: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
1430: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1440: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1450: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1460: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1470: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1480: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1490: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
14b0: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
14c0: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
14d0: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
14e0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
14f0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
1500: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
1510: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
1520: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
1530: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1540: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1550: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1560: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1570: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1580: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1590: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
15a0: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
15b0: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
15c0: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
15d0: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
15e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
15f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1610: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
1620: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
1630: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1640: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1650: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1660: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1670: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1680: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1690: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
16a0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
16b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16c0: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
16d0: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
16e0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
16f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1700: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1710: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
1720: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
1730: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1740: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1750: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1760: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1770: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1780: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1790: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  ( p->nOpAlloc<=p
17a0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
17b0: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
17c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
17d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 41 6c 6c  ssert( p->nOpAll
17e0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
17f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1800: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1810: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
1820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1830: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1840: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1850: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1860: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1870: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1880: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1890: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
18a0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
18b0: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
18c0: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
18d0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
18e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
18f0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
1900: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
1910: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
1920: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
1930: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
1940: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1960: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1970: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1980: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1990: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
19a0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
19b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19c0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
19d0: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
19e0: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
19f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1a00: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
1a10: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a20: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
1a30: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1a40: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1a50: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1a60: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1a70: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1a80: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1a90: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1aa0: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
1ab0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1ad0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
1ae0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
1af0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
1b00: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1b10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1b20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1b50: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1b70: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1b80: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1b90: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1bb0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
1bc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1bd0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
1be0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1bf0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
1c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c10: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1c20: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1c30: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1c40: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1c50: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1c60: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1c70: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1c80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1c90: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1cb0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
1cc0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
1cd0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ce0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
1cf0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
1d00: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1d10: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1d20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1d30: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1d40: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1d50: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1d60: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d70: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1d80: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1d90: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1db0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
1dc0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
1dd0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
1de0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
1df0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
1e00: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1e10: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1e20: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1e30: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1e40: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1e50: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1e60: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1e70: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1e80: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1e90: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1ea0: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1eb0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ec0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ed0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ee0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ef0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1f00: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1f10: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1f20: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1f30: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1f40: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1f50: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
1f60: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
1f70: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  ng does not end 
1f80: 77 69 74 68 20 22 58 22 20 74 68 65 6e 20 61 6e  with "X" then an
1f90: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 69 6e   OP_ResultRow in
1fa0: 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  struction.** is 
1fb0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1fc0: 65 20 76 61 6c 75 65 73 20 69 6e 73 65 72 74 65  e values inserte
1fd0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1fe0: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1ff0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
2000: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
2010: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
2020: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
2030: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
2040: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
2050: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
2060: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
2070: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
2080: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
2090: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20a0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
20b0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
20c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d0: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
20e0: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
20f0: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 69 2c  ng8, 0, iDest+i,
2100: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
2110: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 69 27 20  else if( c=='i' 
2120: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
2140: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
2150: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
2160: 2b 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +i);.    }else{.
2170: 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2180: 6f 70 5f 72 65 73 75 6c 74 72 6f 77 3b 0a 20 20  op_resultrow;.  
2190: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
21a0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
21b0: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 69 44 65  P_ResultRow, iDe
21c0: 73 74 2c 20 69 29 3b 0a 73 6b 69 70 5f 6f 70 5f  st, i);.skip_op_
21d0: 72 65 73 75 6c 74 72 6f 77 3a 0a 20 20 76 61 5f  resultrow:.  va_
21e0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  end(ap);.}../*.*
21f0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
2200: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
2210: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
2220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
2230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2240: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
2250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2260: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2270: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
2280: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2290: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22c0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
22d0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
22e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
22f0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2300: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2310: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2320: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2330: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
2340: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
2350: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
2360: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
2370: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
2380: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
23a0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
23b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
23c0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
23d0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
23e0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
23f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
2400: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
2410: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
2420: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
2430: 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79  or.** P4_REAL ty
2440: 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pe..*/.int sqlit
2450: 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38  e3VdbeAddOp4Dup8
2460: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
2470: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2480: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
2490: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
24a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24b0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
24c0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
24d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
24f0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
2500: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
2510: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2520: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
2530: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
2540: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
2550: 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  zP4,      /* The
2560: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
2570: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
2580: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
2590: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
25a0: 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73  char *p4copy = s
25b0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
25c0: 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44  wNN(sqlite3VdbeD
25d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
25e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
25f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
2620: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
2630: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
2640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
2660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2670: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63  address of the c
2680: 75 72 72 65 6e 74 20 45 58 50 4c 41 49 4e 20 51  urrent EXPLAIN Q
2690: 55 45 52 59 20 50 4c 41 4e 20 62 61 73 65 6c 69  UERY PLAN baseli
26a0: 6e 65 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 22  ne..** 0 means "
26b0: 6e 6f 6e 65 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  none"..*/.int sq
26c0: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
26d0: 50 61 72 65 6e 74 28 50 61 72 73 65 20 2a 70 50  Parent(Parse *pP
26e0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 4f 70 20  arse){.  VdbeOp 
26f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 50 61 72  *pOp;.  if( pPar
2700: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 3d  se->addrExplain=
2710: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2720: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
2730: 62 65 47 65 74 4f 70 28 70 50 61 72 73 65 2d 3e  beGetOp(pParse->
2740: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 61  pVdbe, pParse->a
2750: 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 72  ddrExplain);.  r
2760: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 7d  eturn pOp->p2;.}
2770: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 64 65  ../*.** Set a de
2780: 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
2790: 74 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t on the followi
27a0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  ng routine in or
27b0: 64 65 72 20 74 6f 0a 2a 2a 20 6d 6f 6e 69 74 6f  der to.** monito
27c0: 72 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55  r the EXPLAIN QU
27d0: 45 52 59 20 50 4c 41 4e 20 63 6f 64 65 20 67 65  ERY PLAN code ge
27e0: 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  neration..*/.#if
27f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2800: 44 45 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69  DEBUG).void sqli
2810: 74 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70  te3ExplainBreakp
2820: 6f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  oint(const char 
2830: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
2840: 2a 7a 32 29 7b 0a 20 20 28 76 6f 69 64 29 7a 31  *z2){.  (void)z1
2850: 3b 0a 20 20 28 76 6f 69 64 29 7a 32 3b 0a 7d 0a  ;.  (void)z2;.}.
2860: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
2870: 64 20 61 20 6e 65 77 20 4f 50 5f 20 6f 70 63 6f  d a new OP_ opco
2880: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  de..**.** If the
2890: 20 62 50 75 73 68 20 66 6c 61 67 20 69 73 20 74   bPush flag is t
28a0: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74  rue, then make t
28b0: 68 69 73 20 6f 70 63 6f 64 65 20 74 68 65 20 70  his opcode the p
28c0: 61 72 65 6e 74 20 66 6f 72 0a 2a 2a 20 73 75 62  arent for.** sub
28d0: 73 65 71 75 65 6e 74 20 45 78 70 6c 61 69 6e 73  sequent Explains
28e0: 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 56 64   until sqlite3Vd
28f0: 62 65 45 78 70 6c 61 69 6e 50 6f 70 28 29 20 69  beExplainPop() i
2900: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  s called..*/.voi
2910: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  d sqlite3VdbeExp
2920: 6c 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lain(Parse *pPar
2930: 73 65 2c 20 75 38 20 62 50 75 73 68 2c 20 63 6f  se, u8 bPush, co
2940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
2950: 2e 2e 2e 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ...){.#ifndef SQ
2960: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
2970: 41 6c 77 61 79 73 20 69 6e 63 6c 75 64 65 20 74  Always include t
2980: 68 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  he OP_Explain op
2990: 63 6f 64 65 73 20 69 66 20 53 51 4c 49 54 45 5f  codes if SQLITE_
29a0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
29b0: 2e 0a 20 20 2a 2a 20 42 75 74 20 6f 6d 69 74 20  ..  ** But omit 
29c0: 74 68 65 6d 20 28 66 6f 72 20 70 65 72 66 6f 72  them (for perfor
29d0: 6d 61 6e 63 65 29 20 64 75 72 69 6e 67 20 70 72  mance) during pr
29e0: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 73 20  oduction builds 
29f0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
2a00: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65  >explain==2 ).#e
2a10: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 63 68 61  ndif.  {.    cha
2a20: 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 64 62  r *zMsg;.    Vdb
2a30: 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c 69 73  e *v;.    va_lis
2a40: 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 69 54  t ap;.    int iT
2a50: 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  his;.    va_star
2a60: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20  t(ap, zFmt);.   
2a70: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 56   zMsg = sqlite3V
2a80: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a90: 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  db, zFmt, ap);. 
2aa0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
2ab0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
2ac0: 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 73 20  Vdbe;.    iThis 
2ad0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 73 71  = v->nOp;.    sq
2ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2af0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
2b00: 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e 61 64  This, pParse->ad
2b10: 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a 20 20  drExplain, 0,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e      zMsg, P4_DYN
2b40: 41 4d 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  AMIC);.    sqlit
2b50: 65 33 45 78 70 6c 61 69 6e 42 72 65 61 6b 70 6f  e3ExplainBreakpo
2b60: 69 6e 74 28 62 50 75 73 68 3f 22 50 55 53 48 22  int(bPush?"PUSH"
2b70: 3a 22 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65  :"", sqlite3Vdbe
2b80: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 70 34 2e  GetOp(v,-1)->p4.
2b90: 7a 29 3b 0a 20 20 20 20 69 66 28 20 62 50 75 73  z);.    if( bPus
2ba0: 68 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65  h){.      pParse
2bb0: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
2bc0: 69 54 68 69 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  iThis;.    }.  }
2bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 20 74 68  .}../*.** Pop th
2be0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
2bf0: 50 4c 41 4e 20 73 74 61 63 6b 20 6f 6e 65 20 6c  PLAN stack one l
2c00: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
2c10: 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69 6e  lite3VdbeExplain
2c20: 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  Pop(Parse *pPars
2c30: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e){.  sqlite3Exp
2c40: 6c 61 69 6e 42 72 65 61 6b 70 6f 69 6e 74 28 22  lainBreakpoint("
2c50: 50 4f 50 22 2c 20 30 29 3b 0a 20 20 70 50 61 72  POP", 0);.  pPar
2c60: 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20  se->addrExplain 
2c70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
2c80: 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 72 73  lainParent(pPars
2c90: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
2ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2cb0: 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  AIN */../*.** Ad
2cc0: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2cd0: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2ce0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2cf0: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
2d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d10: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
2d20: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
2d30: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
2d40: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
2d50: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2d60: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2d70: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2d80: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2d90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2da0: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2db0: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2dc0: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2dd0: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2de0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2df0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
2e00: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
2e10: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
2e20: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
2e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e40: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
2e50: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2e60: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2e70: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2e80: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2e90: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2ea0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2ec0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2ed0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2ee0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2ef0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2f00: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
2f10: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2f20: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2f30: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2f40: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f60: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2f70: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2f80: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2f90: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2fa0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2fb0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2ff0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
3000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
3010: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
3020: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
3030: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3040: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
3050: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
3060: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
3070: 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
3080: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
3090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
30a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
30b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70   P4_INT32;.    p
30c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20  Op->p4.i = p4;. 
30d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
30e0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74  ;.}../* Insert t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72  he end of a co-r
3100: 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73  outine.*/.void s
3110: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
3120: 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20  outine(Vdbe *v, 
3130: 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20  int regYield){. 
3140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3150: 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
3160: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
3170: 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  ;..  /* Clear th
3180: 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  e temporary regi
3190: 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72  ster cache, ther
31a0: 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61  eby ensuring tha
31b0: 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72  t each.  ** co-r
31c0: 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f  outine has its o
31d0: 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  wn independent s
31e0: 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c  et of registers,
31f0: 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74   because co-rout
3200: 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20  ines.  ** might 
3210: 65 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67  expect their reg
3220: 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65  isters to be pre
3230: 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e  served across an
3240: 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20   OP_Yield, and. 
3250: 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63   ** that could c
3260: 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66  ause problems if
3270: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d   two or more co-
3280: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69  routines are usi
3290: 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a  ng the same.  **
32a0: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
32b0: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70  ter..  */.  v->p
32c0: 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20  Parse->nTempReg 
32d0: 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65  = 0;.  v->pParse
32e0: 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
32f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
3300: 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20   a new symbolic 
3310: 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73  label for an ins
3320: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61  truction that ha
3330: 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63  s yet to be.** c
3340: 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f  oded.  The symbo
3350: 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61  lic label is rea
3360: 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74  lly just a negat
3370: 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ive number.  The
3380: 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65  .** label can be
3390: 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20   used as the P2 
33a0: 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72  value of an oper
33b0: 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77  ation.  Later, w
33c0: 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  hen.** the label
33d0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20   is resolved to 
33e0: 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65  a specific addre
33f0: 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c  ss, the VDBE wil
3400: 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67  l scan.** throug
3410: 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20  h its operation 
3420: 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20  list and change 
3430: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32  all values of P2
3440: 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20   which match.** 
3450: 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74  the label into t
3460: 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72  he resolved addr
3470: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  ess..**.** The V
3480: 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61  DBE knows that a
3490: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
34a0: 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62  abel because lab
34b0: 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  els are.** alway
34c0: 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50  s negative and P
34d0: 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  2 values are sup
34e0: 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e  pose to be non-n
34f0: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63  egative..** Henc
3500: 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32  e, a negative P2
3510: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
3520: 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  l that has yet t
3530: 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  o be resolved..*
3540: 2a 20 28 4c 61 74 65 72 3a 29 20 54 68 69 73 20  * (Later:) This 
3550: 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72  is only true for
3560: 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 68 61   opcodes that ha
3570: 76 65 20 74 68 65 20 4f 50 46 4c 47 5f 4a 55 4d  ve the OPFLG_JUM
3580: 50 0a 2a 2a 20 70 72 6f 70 65 72 74 79 2e 0a 2a  P.** property..*
3590: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 75 73  *.** Variable us
35a0: 61 67 65 20 6e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a  age notes:.**.**
35b0: 20 20 20 20 20 50 61 72 73 65 2e 61 4c 61 62 65       Parse.aLabe
35c0: 6c 5b 78 5d 20 20 20 20 20 53 74 6f 72 65 73 20  l[x]     Stores 
35d0: 74 68 65 20 61 64 64 72 65 73 73 20 74 68 61 74  the address that
35e0: 20 74 68 65 20 78 2d 74 68 20 6c 61 62 65 6c 20   the x-th label 
35f0: 72 65 73 6f 6c 76 65 73 0a 2a 2a 20 20 20 20 20  resolves.**     
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 69 6e 74 6f 2e 20 20 46 6f 72 20 74      into.  For t
3620: 65 73 74 69 6e 67 20 28 53 51 4c 49 54 45 5f 44  esting (SQLITE_D
3630: 45 42 55 47 29 2c 20 75 6e 72 65 73 6f 6c 76 65  EBUG), unresolve
3640: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 62               lab
3660: 65 6c 73 20 73 74 6f 72 65 73 20 2d 31 2c 20 62  els stores -1, b
3670: 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 72  ut that is not r
3680: 65 71 75 69 72 65 64 2e 0a 2a 2a 20 20 20 20 20  equired..**     
3690: 50 61 72 73 65 2e 6e 4c 61 62 65 6c 41 6c 6c 6f  Parse.nLabelAllo
36a0: 63 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c  c   Number of sl
36b0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ots allocated to
36c0: 20 50 61 72 73 65 2e 61 4c 61 62 65 6c 5b 5d 0a   Parse.aLabel[].
36d0: 2a 2a 20 20 20 20 20 50 61 72 73 65 2e 6e 4c 61  **     Parse.nLa
36e0: 62 65 6c 20 20 20 20 20 20 20 20 54 68 65 20 2a  bel        The *
36f0: 6e 65 67 61 74 69 76 65 2a 20 6f 66 20 74 68 65  negative* of the
3700: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 62 65 6c   number of label
3710: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 62 65 65 6e 20 69 73 73 75         been issu
3740: 65 64 2e 20 20 54 68 65 20 6e 65 67 61 74 69 76  ed.  The negativ
3750: 65 20 69 73 20 73 74 6f 72 65 64 20 62 65 63 61  e is stored beca
3760: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  use.**          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
3780: 68 61 74 20 67 69 76 65 73 20 61 20 70 65 72 66  hat gives a perf
3790: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
37a0: 65 6e 74 20 6f 76 65 72 20 73 74 6f 72 69 6e 67  ent over storing
37b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
37d0: 65 71 75 69 76 61 6c 65 6e 74 20 70 6f 73 69 74  equivalent posit
37e0: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e  ive value..*/.in
37f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  t sqlite3VdbeMak
3800: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 50  eLabel(Parse *pP
3810: 61 72 73 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  arse){.  return 
3820: 2d 2d 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  --pParse->nLabel
3830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
3840: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
3850: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
3860: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3870: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
3880: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
3890: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
38a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
38b0: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
38c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
38d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
38e0: 6c 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  l()..*/.static S
38f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3900: 6f 69 64 20 72 65 73 69 7a 65 52 65 73 6f 6c 76  oid resizeResolv
3910: 65 4c 61 62 65 6c 28 50 61 72 73 65 20 2a 70 2c  eLabel(Parse *p,
3920: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6a 29   Vdbe *v, int j)
3930: 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65  {.  int nNewSize
3940: 20 3d 20 31 30 20 2d 20 70 2d 3e 6e 4c 61 62 65   = 10 - p->nLabe
3950: 6c 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  l;.  p->aLabel =
3960: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
3970: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
3980: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39a0: 4e 65 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 70  NewSize*sizeof(p
39b0: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20  ->aLabel[0]));. 
39c0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 3d 3d   if( p->aLabel==
39d0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  0 ){.    p->nLab
39e0: 65 6c 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  elAlloc = 0;.  }
39f0: 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c  else{.#ifdef SQL
3a00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 6e  ITE_DEBUG.    in
3a10: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
3a20: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 3b 20 69  ->nLabelAlloc; i
3a30: 3c 6e 4e 65 77 53 69 7a 65 3b 20 69 2b 2b 29 20  <nNewSize; i++) 
3a40: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
3a50: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  1;.#endif.    p-
3a60: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 6e  >nLabelAlloc = n
3a70: 4e 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 2d 3e  NewSize;.    p->
3a80: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
3a90: 4f 70 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  Op;.  }.}.void s
3aa0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
3ab0: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20  eLabel(Vdbe *v, 
3ac0: 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20  int x){.  Parse 
3ad0: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
3ae0: 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78    int j = ADDR(x
3af0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  );.  assert( v->
3b00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3b10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
3b20: 72 74 28 20 6a 3c 2d 70 2d 3e 6e 4c 61 62 65 6c  rt( j<-p->nLabel
3b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
3b40: 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  =0 );.#ifdef SQL
3b50: 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
3b60: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
3b70: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
3b80: 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
3b90: 74 66 28 22 52 45 53 4f 4c 56 45 20 4c 41 42 45  tf("RESOLVE LABE
3ba0: 4c 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 78  L %d to %d\n", x
3bb0: 2c 20 76 2d 3e 6e 4f 70 29 3b 0a 20 20 7d 0a 23  , v->nOp);.  }.#
3bc0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 6e  endif.  if( p->n
3bd0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 2b 20 70 2d 3e  LabelAlloc + p->
3be0: 6e 4c 61 62 65 6c 20 3c 20 30 20 29 7b 0a 20 20  nLabel < 0 ){.  
3bf0: 20 20 72 65 73 69 7a 65 52 65 73 6f 6c 76 65 4c    resizeResolveL
3c00: 61 62 65 6c 28 70 2c 76 2c 6a 29 3b 0a 20 20 7d  abel(p,v,j);.  }
3c10: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3c20: 28 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 3d 3d  ( p->aLabel[j]==
3c30: 28 2d 31 29 20 29 3b 20 2f 2a 20 4c 61 62 65 6c  (-1) ); /* Label
3c40: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
3c50: 73 6f 6c 76 65 64 20 6f 6e 63 65 20 2a 2f 0a 20  solved once */. 
3c60: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
3c70: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a  = v->nOp;.  }.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
3c90: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
3ca0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
3cb0: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
3cc0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
3cd0: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
3ce0: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
3cf0: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Once = 1;.}../*.
3d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
3d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
3d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c   only be run mul
3d30: 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a  tiple times..*/.
3d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3d50: 52 65 75 73 61 62 6c 65 28 56 64 62 65 20 2a 70  Reusable(Vdbe *p
3d60: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
3d70: 6e 63 65 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64  nce = 0;.}..#ifd
3d80: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
3d90: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
3da0: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
3db0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
3dc0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
3dd0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
3de0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
3df0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3e00: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
3e10: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
3e20: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
3e30: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
3e40: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
3e50: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
3e60: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
3e70: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
3e80: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3e90: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
3ea0: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
3eb0: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
3ec0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
3ed0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
3ee0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
3f10: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
3f20: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
3f30: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3f40: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
3f50: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
3f60: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
3f70: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
3f80: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3f90: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
3fa0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
3fb0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
3fc0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
3fd0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
3fe0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
4000: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
4010: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
4020: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
4030: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
4040: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4050: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
4060: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
4070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4080: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4090: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
40a0: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
40b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
40c0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
40d0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
40e0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
40f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4100: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
4110: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
4120: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
4130: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
4140: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
4150: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
4160: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
4170: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
4180: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
4190: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
41a0: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
41b0: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
41c0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
41d0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
41e0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
41f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4200: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
4210: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
4220: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
4230: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
4240: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
4250: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
4260: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
4270: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
4280: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
4290: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
42a0: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
42b0: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
42c0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
42d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
42e0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
42f0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
4300: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
4310: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
4320: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
4330: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
4340: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
4350: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4370: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
4380: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
4390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
43a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
43b0: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
43c0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
43d0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
43e0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
43f0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
4400: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
4420: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
4440: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
4450: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
4460: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
4470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4480: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
4490: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
44a0: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
44b0: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
44c0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
44d0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
44e0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
44f0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
4500: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
4510: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
4520: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
4530: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
4540: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
4550: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
4560: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
4570: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
4580: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
4590: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
45a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
45b0: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
45c0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
45d0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
45e0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
45f0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
4600: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
4610: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
4620: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
4630: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
4640: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
4650: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
4660: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
4670: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
4680: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
4690: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
46a0: 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65  ).**   *  OP_Cre
46b0: 61 74 65 42 74 72 65 65 2f 42 54 52 45 45 5f 49  ateBtree/BTREE_I
46c0: 4e 54 4b 45 59 20 61 6e 64 20 4f 50 5f 49 6e 69  NTKEY and OP_Ini
46d0: 74 43 6f 72 6f 75 74 69 6e 65 20 0a 2a 2a 20 20  tCoroutine .**  
46e0: 20 20 20 20 28 66 6f 72 20 43 52 45 41 54 45 20      (for CREATE 
46f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
4700: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
4710: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
4720: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
4730: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
4740: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
4750: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
4760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
4770: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4780: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
4790: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
47a0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
47b0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
47c0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
47d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
47e0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
47f0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
4800: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
4810: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4820: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
4830: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
4840: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
4850: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
4860: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
4870: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
4880: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
4890: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
48a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
48b0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
48c0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
48d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
48e0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
48f0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
4900: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
4910: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
4920: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
4930: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
4940: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
4950: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
4960: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
4970: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
4980: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
4990: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
49a0: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
49b0: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
49c0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
49d0: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 6f 70  name .     || op
49e0: 63 6f 64 65 3d 3d 4f 50 5f 56 44 65 73 74 72 6f  code==OP_VDestro
49f0: 79 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64  y.     || (opcod
4a00: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 20  e==OP_Function0 
4a10: 26 26 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63  && pOp->p4.pFunc
4a20: 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
4a30: 54 45 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c  TE_FUNC_INTERNAL
4a40: 29 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  ).     || ((opco
4a50: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
4a60: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
4a70: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
4a80: 28 28 70 4f 70 2d 3e 70 31 29 21 3d 53 51 4c 49  ((pOp->p1)!=SQLI
4a90: 54 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70 32  TE_OK && pOp->p2
4aa0: 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20  ==OE_Abort)).   
4ab0: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f   ){.      hasAbo
4ac0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  rt = 1;.      br
4ad0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72  f( opcode==OP_Cr
4af0: 65 61 74 65 42 74 72 65 65 20 26 26 20 70 4f 70  eateBtree && pOp
4b00: 2d 3e 70 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b  ->p3==BTREE_INTK
4b10: 45 59 20 29 20 68 61 73 43 72 65 61 74 65 54 61  EY ) hasCreateTa
4b20: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ble = 1;.    if(
4b30: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74   opcode==OP_Init
4b40: 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49  Coroutine ) hasI
4b50: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  nitCoroutine = 1
4b60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4b70: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
4b80: 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  Y.    if( opcode
4b90: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
4ba0: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
4bb0: 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20  pOp->p2==1 ){.  
4bc0: 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72      hasFkCounter
4bd0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
4be0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
4bf0: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
4c00: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
4c10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4c20: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
4c30: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
4c40: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
4c50: 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  rred..  ** If ma
4c60: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
4c70: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
4c80: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
4c90: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
4ca0: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
4cb0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
4cc0: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
4cd0: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
4ce0: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
4cf0: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
4d00: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
4d10: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
4d20: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
4d30: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
4d40: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
4d50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
4d60: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
4d70: 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75  bort || hasFkCou
4d80: 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  nter.           
4d90: 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65     || (hasCreate
4da0: 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74  Table && hasInit
4db0: 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a  Coroutine) );.}.
4dc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4dd0: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
4de0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
4df0: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
4e00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4e10: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  DEBUG./*.** Incr
4e20: 65 6d 65 6e 74 20 74 68 65 20 6e 57 72 69 74 65  ement the nWrite
4e30: 20 63 6f 75 6e 74 65 72 20 69 6e 20 74 68 65 20   counter in the 
4e40: 56 44 42 45 20 69 66 20 74 68 65 20 63 75 72 73  VDBE if the curs
4e50: 6f 72 20 69 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20  or is not an.** 
4e60: 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
4e70: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 75 72 73  , or if the curs
4e80: 6f 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  or argument is N
4e90: 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ULL..*/.void sql
4ea0: 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
4eb0: 65 43 6f 75 6e 74 65 72 28 56 64 62 65 20 2a 70  eCounter(Vdbe *p
4ec0: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
4ed0: 29 7b 0a 20 20 69 66 28 20 70 43 3d 3d 30 0a 20  ){.  if( pC==0. 
4ee0: 20 20 7c 7c 20 28 70 43 2d 3e 65 43 75 72 54 79    || (pC->eCurTy
4ef0: 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52 54  pe!=CURTYPE_SORT
4f00: 45 52 0a 20 20 20 20 20 20 20 26 26 20 70 43 2d  ER.       && pC-
4f10: 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
4f20: 50 45 5f 50 53 45 55 44 4f 0a 20 20 20 20 20 20  PE_PSEUDO.      
4f30: 20 26 26 20 21 70 43 2d 3e 69 73 45 70 68 65 6d   && !pC->isEphem
4f40: 65 72 61 6c 29 0a 20 20 29 7b 0a 20 20 20 20 70  eral).  ){.    p
4f50: 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 7d 0a  ->nWrite++;.  }.
4f60: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
4f70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
4f80: 0a 2a 2a 20 41 73 73 65 72 74 20 69 66 20 61 6e  .** Assert if an
4f90: 20 41 62 6f 72 74 20 61 74 20 74 68 69 73 20 70   Abort at this p
4fa0: 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 6d 69 67  oint in time mig
4fb0: 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ht result in a c
4fc0: 6f 72 72 75 70 74 0a 2a 2a 20 64 61 74 61 62 61  orrupt.** databa
4fd0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
4fe0: 74 65 33 56 64 62 65 41 73 73 65 72 74 41 62 6f  te3VdbeAssertAbo
4ff0: 72 74 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b  rtable(Vdbe *p){
5000: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 57  .  assert( p->nW
5010: 72 69 74 65 3d 3d 30 20 7c 7c 20 70 2d 3e 75 73  rite==0 || p->us
5020: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b  esStmtJournal );
5030: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5050: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
5060: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
5070: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49  een inserted.  I
5080: 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75  t loops.** throu
5090: 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64  gh all the opcod
50a0: 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20  es and fixes up 
50b0: 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  some details..**
50c0: 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68  .** (1) For each
50d0: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
50e0: 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76  n with a negativ
50f0: 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61  e P2 value (a la
5100: 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f  bel).**     reso
5110: 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65  lve the P2 value
5120: 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64   to an actual ad
5130: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29  dress..**.** (2)
5140: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78   Compute the max
5150: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
5160: 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79  rguments used by
5170: 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f   any SQL functio
5180: 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f  n.**     and sto
5190: 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  re that value in
51a0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a   *pMaxFuncArgs..
51b0: 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65  **.** (3) Update
51c0: 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e   the Vdbe.readOn
51d0: 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52  ly and Vdbe.bIsR
51e0: 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61  eader flags to a
51f0: 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20  ccurately.**    
5200: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
5210: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
5220: 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64  ement actually d
5230: 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49  oes..**.** (4) I
5240: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34  nitialize the p4
5250: 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  .xAdvance pointe
5260: 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61  r on opcodes tha
5270: 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  t use it..**.** 
5280: 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20  (5) Reclaim the 
5290: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
52a0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62   for storing lab
52b0: 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  els..**.** This 
52c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
52d0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65  y function corre
52e0: 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70  ctly if the mkop
52f0: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
5300: 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75  tor.** script nu
5310: 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65  mbers the opcode
5320: 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68  s correctly.  Ch
5330: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f  anges to this ro
5340: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a  utine must be.**
5350: 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74   coordinated wit
5360: 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f  h changes to mko
5370: 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73  pcodeh.tcl..*/.s
5380: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
5390: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
53a0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
53b0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d  cArgs){.  int nM
53c0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
53d0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
53e0: 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p;.  Parse *pPar
53f0: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
5400: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
5410: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a  pParse->aLabel;.
5420: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
5430: 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65  1;.  p->bIsReade
5440: 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26  r = 0;.  pOp = &
5450: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5460: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20  ;.  while(1){.. 
5470: 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20     /* Only JUMP 
5480: 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20  opcodes and the 
5490: 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70  short list of sp
54a0: 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e  ecial opcodes in
54b0: 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20   the switch.    
54c0: 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f  ** below need to
54d0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
54e0: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
54f0: 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72  cl generator scr
5500: 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a  ipt groups.    *
5510: 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f  * all these opco
5520: 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61  des together nea
5530: 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  r the front of t
5540: 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20  he opcode list. 
5550: 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79   Skip.    ** any
5560: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65   opcode that doe
5570: 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65  s not need proce
5580: 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c  ssing by virtual
5590: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
55a0: 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c  t.    ** it is l
55b0: 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
55c0: 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45  E_MX_JUMP_OPCODE
55d0: 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  , as a performan
55e0: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
55f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c  pOp->opcode<=SQL
5610: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
5620: 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  DE ){.      /* N
5630: 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20  OTE: Be sure to 
5640: 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68  update mkopcodeh
5650: 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67  .tcl when adding
5660: 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20   or removing.   
5670: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
5680: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
5690: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
56a0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
56b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
56c0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
56d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
56e0: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
56f0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
5700: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
5710: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
5720: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
5730: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20  oCommit:.       
5740: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
5750: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt: {.          
5760: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
5770: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5780: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
5790: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
57a0: 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73  _WAL.        cas
57b0: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
57c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
57d0: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
57e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
57f0: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
5800: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64           p->read
5810: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
5820: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
5830: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
5840: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5850: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
5860: 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20 20 63  _Next:.        c
5870: 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
5880: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t: {.          p
5890: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
58a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
58b0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  xt;.          pO
58c0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
58d0: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
58e0: 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65    /* The code ge
58f0: 6e 65 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f  nerator never co
5900: 64 65 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65  des any of these
5910: 20 6f 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75   opcodes as a ju
5920: 6d 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  mp.          ** 
5930: 74 6f 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65  to a label.  The
5940: 79 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64  y are always cod
5950: 65 64 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63  ed as a jump bac
5960: 6b 77 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20  kwards to a .   
5970: 20 20 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20         ** known 
5980: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20  address */.     
5990: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
59a0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20  ->p2>=0 );.     
59b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
59c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
59d0: 73 65 20 4f 50 5f 50 72 65 76 3a 20 7b 0a 20 20  se OP_Prev: {.  
59e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
59f0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
5a00: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
5a10: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
5a20: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
5a30: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  NCE;.          /
5a40: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
5a50: 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 73  ator never codes
5a60: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f 70   any of these op
5a70: 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70 0a  codes as a jump.
5a80: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
5a90: 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 61  a label.  They a
5aa0: 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64 20  re always coded 
5ab0: 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 61  as a jump backwa
5ac0: 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20 20  rds to a .      
5ad0: 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64      ** known add
5ae0: 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ress */.        
5af0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5b00: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  2>=0 );.        
5b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5b20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5b30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
5b40: 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73 65  BLE.        case
5b50: 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
5b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
5b70: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
5b80: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
5b90: 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  p2;.          br
5ba0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5bb0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
5bc0: 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Filter: {.      
5bd0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
5be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
5bf0: 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33  p - p->aOp) >= 3
5c00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
5c10: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
5c20: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
5c30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20   );.          n 
5c40: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
5c50: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d          if( n>nM
5c60: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
5c70: 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  s = n;.         
5c80: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
5c90: 20 69 6e 74 6f 20 74 68 65 20 64 65 66 61 75 6c   into the defaul
5ca0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  t case */.      
5cb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
5cc0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5cd0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
5ce0: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  >p2<0 ){.       
5cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
5d00: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
5d10: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
5d20: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
5d30: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 20 20   only.          
5d40: 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f 70    ** non-jump op
5d50: 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e 20  codes less than 
5d60: 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 43  SQLITE_MX_JUMP_C
5d70: 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74 65  ODE are guarante
5d80: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
5d90: 20 20 2a 2a 20 68 61 76 65 20 6e 6f 6e 2d 6e 65    ** have non-ne
5da0: 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 66 6f  gative values fo
5db0: 72 20 50 32 2e 20 2a 2f 0a 20 20 20 20 20 20 20  r P2. */.       
5dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 73 71       assert( (sq
5dd0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
5de0: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
5df0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
5e00: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
5e10: 20 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f   assert( ADDR(pO
5e20: 70 2d 3e 70 32 29 3c 2d 70 50 61 72 73 65 2d 3e  p->p2)<-pParse->
5e30: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
5e40: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
5e50: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
5e60: 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20 20 20 20  >p2)];.         
5e70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
5e80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54      }.      /* T
5ea0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  he mkopcodeh.tcl
5eb0: 20 73 63 72 69 70 74 20 68 61 73 20 73 6f 20 61   script has so a
5ec0: 72 72 61 6e 67 65 64 20 74 68 69 6e 67 73 20 74  rranged things t
5ed0: 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a 20 20 20  hat the only.   
5ee0: 20 20 20 2a 2a 20 6e 6f 6e 2d 6a 75 6d 70 20 6f     ** non-jump o
5ef0: 70 63 6f 64 65 73 20 6c 65 73 73 20 74 68 61 6e  pcodes less than
5f00: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
5f10: 43 4f 44 45 20 61 72 65 20 67 75 61 72 61 6e 74  CODE are guarant
5f20: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eed to.      ** 
5f30: 68 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  have non-negativ
5f40: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e  e values for P2.
5f50: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
5f60: 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  ( (sqlite3Opcode
5f70: 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70  Property[pOp->op
5f80: 63 6f 64 65 5d 26 4f 50 46 4c 47 5f 4a 55 4d 50  code]&OPFLG_JUMP
5f90: 29 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3e  )==0 || pOp->p2>
5fa0: 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  =0);.    }.    i
5fb0: 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29  f( pOp==p->aOp )
5fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d   break;.    pOp-
5fd0: 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  -;.  }.  sqlite3
5fe0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
5ff0: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
6000: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
6010: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
6020: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
6030: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
6040: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
6050: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
6060: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
6070: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
6080: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6090: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
60a0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
60b0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
60c0: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
60d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
60e0: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
60f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6100: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6110: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
6120: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
6130: 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20 6c  Verify that at l
6140: 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c  east N opcode sl
6150: 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ots are availabl
6160: 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a  e in p without.*
6170: 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c  * having to mall
6180: 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63  oc for more spac
6190: 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20 63  e (except when c
61a0: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a  ompiled using.**
61b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
61c0: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54  LLOC_STRESS).  T
61d0: 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
61e0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
61f0: 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66  ting.** to verif
6200: 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 63  y that certain c
6210: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
6220: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63  dbeAddOpList() c
6230: 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c  an never.** fail
6240: 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61   due to a OOM fa
6250: 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68  ult and hence th
6260: 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  at the return va
6270: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  lue from.** sqli
6280: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6290: 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  () will always b
62a0: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23  e non-NULL..*/.#
62b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
62c0: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
62d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
62e0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
62f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6300: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
6310: 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c  equired(Vdbe *p,
6320: 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
6330: 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d  t( p->nOp + N <=
6340: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a   p->nOpAlloc );.
6350: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
6360: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
6370: 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68 65  VM passed as the
6380: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 64   only argument d
6390: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
63a0: 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 52  ** an OP_ResultR
63b0: 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c 20  ow opcode. Fail 
63c0: 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20 69  an assert() if i
63d0: 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73 20  t does. This is 
63e0: 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65 20  used.** by code 
63f0: 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20 65  in pragma.c to e
6400: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69  nsure that the i
6410: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
6420: 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61 67   certain.** prag
6430: 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69 74  mas comports wit
6440: 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65 63  h the flags spec
6450: 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b 70  ified in the mkp
6460: 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a 20  ragmatab.tcl.** 
6470: 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20 64  script..*/.#if d
6480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
6490: 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
64a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41  (SQLITE_TEST_REA
64b0: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69  LLOC_STRESS).voi
64c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72  d sqlite3VdbeVer
64d0: 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 56  ifyNoResultRow(V
64e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
64f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
6500: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
6510: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b   assert( p->aOp[
6520: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 65  i].opcode!=OP_Re
6530: 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a 7d  sultRow );.  }.}
6540: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
6550: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61 20  enerate code (a 
6560: 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74 61  single OP_Aborta
6570: 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61 74  ble opcode) that
6580: 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79 20   will.** verify 
6590: 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70 72  that the VDBE pr
65a0: 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c 79  ogram can safely
65b0: 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20 74   call Abort in t
65c0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
65d0: 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64 65  ntext..*/.#if de
65e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
65f0: 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UG).void sqlite3
6600: 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
6610: 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ble(Vdbe *p, int
6620: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66 28   onError){.  if(
6630: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
6640: 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rt ) sqlite3Vdbe
6650: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62 6f  AddOp0(p, OP_Abo
6660: 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69  rtable);.}.#endi
6670: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
6680: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
6690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
66a0: 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73  array of opcodes
66b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
66c0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73  .** the Vdbe pas
66d0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
66e0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73   argument. It is
66f0: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
6700: 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74  ponsibility.** t
6710: 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68  o arrange for th
6720: 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79  e returned array
6730: 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c   to be eventuall
6740: 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68  y freed using th
6750: 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70  e .** vdbeFreeOp
6760: 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e  Array() function
6770: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
6780: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20  eturning, *pnOp 
6790: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
67a0: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
67b0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  in the returned.
67c0: 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20  ** array. Also, 
67d0: 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74  *pnMaxArg is set
67e0: 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f   to the larger o
67f0: 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  f its current va
6800: 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20  lue and .** the 
6810: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
6820: 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70  s in the Vdbe.ap
6830: 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75  Arg[] array requ
6840: 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20  ired to execute 
6850: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
6860: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62   program..*/.Vdb
6870: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6880: 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65  TakeOpArray(Vdbe
6890: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20   *p, int *pnOp, 
68a0: 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a  int *pnMaxArg){.
68b0: 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20    VdbeOp *aOp = 
68c0: 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->aOp;.  assert
68d0: 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d  ( aOp && !p->db-
68e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
68f0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
6900: 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  t sqlite3VdbeUse
6910: 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74  sBtree() was not
6920: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
6930: 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  VM */.  assert( 
6940: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
6950: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a  >btreeMask) );..
6960: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
6970: 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a  s(p, pnMaxArg);.
6980: 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70    *pnOp = p->nOp
6990: 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a  ;.  p->aOp = 0;.
69a0: 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a    return aOp;.}.
69b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f  ./*.** Add a who
69c0: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61  le list of opera
69d0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65  tions to the ope
69e0: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52  ration stack.  R
69f0: 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
6a00: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
6a10: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65  ed..**.** Non-ze
6a30: 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73 20  ro P2 arguments 
6a40: 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  to jump instruct
6a50: 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ions are automat
6a60: 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a  ically adjusted.
6a70: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a  ** so that the j
6a80: 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72 65  ump target is re
6a90: 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66 69  lative to the fi
6aa0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  rst operation in
6ab0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f  serted..*/.VdbeO
6ac0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 64  p *sqlite3VdbeAd
6ad0: 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65 20  dOpList(.  Vdbe 
6ae0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6af0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 6f          /* Add o
6b00: 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70 72  pcodes to the pr
6b10: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
6b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20   */.  int nOp,  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6b50: 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20 2a  opcodes to add *
6b60: 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63  /.  VdbeOpList c
6b70: 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 20  onst *aOp,      
6b80: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20   /* The opcodes 
6b90: 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20  to be added */. 
6ba0: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20   int iLineno    
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6bc0: 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e   Source-file lin
6bd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73  e number of firs
6be0: 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  t opcode */.){. 
6bf0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
6c00: 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b   *pOut, *pFirst;
6c10: 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30  .  assert( nOp>0
6c20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
6c30: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
6c40: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
6c50: 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20   p->nOp + nOp > 
6c60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  p->nOpAlloc && g
6c70: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f  rowOpArray(p, nO
6c80: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
6c90: 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74   0;.  }.  pFirst
6ca0: 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f   = pOut = &p->aO
6cb0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72  p[p->nOp];.  for
6cc0: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
6cd0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
6ce0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f  {.    pOut->opco
6cf0: 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65  de = aOp->opcode
6d00: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d  ;.    pOut->p1 =
6d10: 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f   aOp->p1;.    pO
6d20: 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32  ut->p2 = aOp->p2
6d30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f  ;.    assert( aO
6d40: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
6d50: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
6d60: 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e  deProperty[aOp->
6d70: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
6d80: 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d  JUMP)!=0 && aOp-
6d90: 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
6da0: 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f  Out->p2 += p->nO
6db0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  p;.    }.    pOu
6dc0: 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b  t->p3 = aOp->p3;
6dd0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70  .    pOut->p4typ
6de0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
6df0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
6e00: 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35   0;.    pOut->p5
6e10: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
6e20: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6e30: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
6e40: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
6e50: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
6e60: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
6e70: 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d  VERAGE.    pOut-
6e80: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
6e90: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
6ea0: 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a   (void)iLineno;.
6eb0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
6ec0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
6ed0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
6ee0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
6ef0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
6f00: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
6f10: 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c  tOp(0, i+p->nOp,
6f20: 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f   &p->aOp[i+p->nO
6f30: 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p]);.    }.#endi
6f40: 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b  f.  }.  p->nOp +
6f50: 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = nOp;.  return 
6f60: 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64  pFirst;.}..#if d
6f70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6f80: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
6f90: 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ATUS)./*.** Add 
6fa0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
6fb0: 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72  array of counter
6fc0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c  s managed by sql
6fd0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
6fe0: 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  atus()..*/.void 
6ff0: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
7000: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70  tatus(.  Vdbe *p
7010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74           /* VM t
7030: 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
7040: 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  () to */.  int a
7050: 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20  ddrExplain,     
7060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7070: 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
7080: 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20  ain (or 0) */.  
7090: 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20  int addrLoop,   
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f  /* Address of lo
70c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20  op counter */ . 
70d0: 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20   int addrVisit, 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
7100: 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e  ows visited coun
7110: 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ter */.  LogEst 
7120: 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  nEst,           
7130: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
7140: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
7150: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
7160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7170: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
7180: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
7190: 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67  e or index being
71a0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20   scanned */.){. 
71b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
71c0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e  Byte = (p->nScan
71d0: 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61  +1) * sizeof(Sca
71e0: 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e  nStatus);.  Scan
71f0: 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20  Status *aNew;.  
7200: 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74  aNew = (ScanStat
7210: 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61  us*)sqlite3DbRea
7220: 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  lloc(p->db, p->a
7230: 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Scan, nByte);.  
7240: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
7250: 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77  ScanStatus *pNew
7260: 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61   = &aNew[p->nSca
7270: 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n++];.    pNew->
7280: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64  addrExplain = ad
7290: 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70  drExplain;.    p
72a0: 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20  New->addrLoop = 
72b0: 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e  addrLoop;.    pN
72c0: 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20  ew->addrVisit = 
72d0: 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70  addrVisit;.    p
72e0: 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74  New->nEst = nEst
72f0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d  ;.    pNew->zNam
7300: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7310: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Dup(p->db, zName
7320: 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20  );.    p->aScan 
7330: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65  = aNew;.  }.}.#e
7340: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
7350: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
7360: 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20   the opcode, or 
7370: 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50  P1, P2, P3, or P
7380: 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f  5 operands.** fo
7390: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
73a0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
73b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
73c0: 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  ngeOpcode(Vdbe *
73d0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20  p, u32 addr, u8 
73e0: 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73  iNewOpcode){.  s
73f0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7400: 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20  p,addr)->opcode 
7410: 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a  = iNewOpcode;.}.
7420: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7430: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
7440: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
7450: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
7460: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
7470: 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p1 = val;.}.vo
7480: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
7490: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
74a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
74b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
74c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
74d0: 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p2 = val;.}.void
74e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
74f0: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
7500: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
7510: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
7520: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33  etOp(p,addr)->p3
7530: 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73   = val;.}.void s
7540: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7550: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20  P5(Vdbe *p, u16 
7560: 70 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  p5){.  assert( p
7570: 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62  ->nOp>0 || p->db
7580: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7590: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30  ;.  if( p->nOp>0
75a0: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70   ) p->aOp[p->nOp
75b0: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a  -1].p5 = p5;.}..
75c0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
75d0: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
75e0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
75f0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
7600: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
7610: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
7620: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
7630: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
7640: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7650: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
7660: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
7670: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
7680: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
7690: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
76a0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
76b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
76c0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
76d0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
76e0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
76f0: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
7700: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
7710: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
7720: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7730: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
7740: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
7750: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
7760: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
7770: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
7780: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7790: 4e 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20  NN(db, pDef);.  
77a0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
77b0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
77c0: 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a  (sqlite3 *, Op *
77d0: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44  , int);../*.** D
77e0: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
77f0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
7800: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
7810: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72  NOINLINE void fr
7820: 65 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20  eeP4Mem(sqlite3 
7830: 2a 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20  *db, Mem *p){.  
7840: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
7850: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
7860: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
7870: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7880: 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61  NN(db, p);.}.sta
7890: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
78a0: 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46  INE void freeP4F
78b0: 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a  uncCtx(sqlite3 *
78c0: 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  db, sqlite3_cont
78d0: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45  ext *p){.  freeE
78e0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
78f0: 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a  (db, p->pFunc);.
7900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
7910: 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  (db, p);.}.stati
7920: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71  c void freeP4(sq
7930: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70  lite3 *db, int p
7940: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29  4type, void *p4)
7950: 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  {.  assert( db )
7960: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79  ;.  switch( p4ty
7970: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
7980: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
7990: 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78     freeP4FuncCtx
79a0: 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f  (db, (sqlite3_co
79b0: 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20  ntext*)p4);.    
79c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
79d0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
79e0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
79f0: 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  64:.    case P4_
7a00: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73  DYNAMIC:.    cas
7a10: 65 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20  e P4_DYNBLOB:.  
7a20: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
7a30: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
7a40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
7a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7a70: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7a80: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
7a90: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
7aa0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
7ab0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
7ac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ad0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
7ae0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
7af0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
7b00: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
7b10: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7b20: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
7b30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
7b50: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7b60: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
7b70: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
7b80: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
7b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7bb0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
7bc0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
7bd0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
7be0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7bf0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
7c00: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
7c10: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
7c20: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
7c30: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
7c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7c50: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
7c60: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
7c70: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
7c80: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
7c90: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
7ca0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
7cb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7cc0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
7cd0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
7ce0: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
7cf0: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
7d00: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
7d10: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
7d20: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
7d30: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
7d40: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
7d50: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
7d60: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
7d70: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
7d80: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
7d90: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
7da0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
7db0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
7dc0: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e    for(pOp=&aOp[n
7dd0: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b  Op-1]; pOp>=aOp;
7de0: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pOp--){.      i
7df0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c  f( pOp->p4type <
7e00: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20  = P4_FREE_IF_LE 
7e10: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70  ) freeP4(db, pOp
7e20: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
7e30: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
7e40: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7e50: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
7e60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7e70: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
7e80: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
7e90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7ea0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f  3DbFreeNN(db, aO
7eb0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7ec0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
7ed0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
7ee0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7ef0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
7f00: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
7f10: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
7f20: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
7f30: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
7f40: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
7f50: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
7f60: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
7f70: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
7f80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f90: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
7fa0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
7fb0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
7fc0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
7fd0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
7fe0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
7ff0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
8000: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
8010: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
8020: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Noop.*/.int sqli
8030: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
8040: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
8050: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70   addr){.  VdbeOp
8060: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e   *pOp;.  if( p->
8070: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8080: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
8090: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26  ssert( addr>=0 &
80a0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  & addr<p->nOp );
80b0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
80c0: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34  [addr];.  freeP4
80d0: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74  (p->db, pOp->p4t
80e0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
80f0: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
8100: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70   P4_NOTUSED;.  p
8110: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20  Op->p4.z = 0;.  
8120: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
8130: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  _Noop;.  return 
8140: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  1;.}../*.** If t
8150: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
8160: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
8170: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
8180: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
8190: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
81a0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
81b0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
81c0: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
81d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
81e0: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
81f0: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
8200: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70  p){.  if( p->nOp
8210: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e  >0 && p->aOp[p->
8220: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f  nOp-1].opcode==o
8230: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8240: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8250: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f  eToNoop(p, p->nO
8260: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  p-1);.  }else{. 
8270: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
8290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
82a0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
82b0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
82c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
82d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
82e0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
82f0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
8300: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
8310: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
8330: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
8340: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
8350: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
8360: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
8370: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
8380: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
8390: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
83a0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
83b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
83c0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
83d0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
83e0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
83f0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
8400: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
8410: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
8420: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
8430: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
8440: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
8450: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
8460: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
8470: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
8480: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
8490: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
84a0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
84b0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
84c0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
84d0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
84e0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
84f0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
8500: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
8510: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
8520: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
8530: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
8540: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
8550: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
8560: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
8570: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
8580: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
8590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53  */.static void S
85a0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
85b0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28  dbeChangeP4Full(
85c0: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70  .  Vdbe *p,.  Op
85d0: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63   *pOp,.  const c
85e0: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20  har *zP4,.  int 
85f0: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  n.){.  if( pOp->
8600: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72  p4type ){.    fr
8610: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
8620: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
8630: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  .p);.    pOp->p4
8640: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
8650: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d  p->p4.p = 0;.  }
8660: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  .  if( n<0 ){.  
8670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8680: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70  ngeP4(p, (int)(p
8690: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50  Op - p->aOp), zP
86a0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  4, n);.  }else{.
86b0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
86c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
86d0: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  30(zP4);.    pOp
86e0: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
86f0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
8700: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
8710: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
8720: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f  YNAMIC;.  }.}.vo
8730: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
8740: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
8750: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
8760: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
8770: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
8780: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
8790: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
87a0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
87b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
87c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
87d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
87e0: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp!=0 || db->m
87f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8800: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8810: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
8820: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72   n!=P4_VTAB ) fr
8830: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
8840: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
8850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8860: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
8870: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
8880: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
8890: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
88a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
88b0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
88c0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
88d0: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c  r];.  if( n>=0 |
88e0: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  | pOp->p4type ){
88f0: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50  .    vdbeChangeP
8900: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50  4Full(p, pOp, zP
8910: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  4, n);.    retur
8920: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d  n;.  }.  if( n==
8930: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
8940: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
8950: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
8960: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
8970: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
8980: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
8990: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
89a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
89b0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
89c0: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
89d0: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
89e0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
89f0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
8a00: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20  ( zP4!=0 ){.    
8a10: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20  assert( n<0 );. 
8a20: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
8a30: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
8a40: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
8a50: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20  gned char)n;.   
8a60: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
8a70: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63  ) sqlite3VtabLoc
8a80: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b  k((VTable*)zP4);
8a90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8aa0: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72  ange the P4 oper
8ab0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  and of the most 
8ac0: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
8ad0: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74  nstruction .** t
8ae0: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69  o the value defi
8af0: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d  ned by the argum
8b00: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61  ents.  This is a
8b10: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
8b20: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
8b30: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e  3VdbeChangeP4().
8b40: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70  .**.** The P4 op
8b50: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68  erand must not h
8b60: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75  ave been previou
8b70: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e  sly defined.  An
8b80: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20  d the new.** P4 
8b90: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49  must not be P4_I
8ba0: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74  NT32.  Use sqlit
8bb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29  e3VdbeChangeP4()
8bc0: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a   in either of.**
8bd0: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f   those cases..*/
8be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8bf0: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a  eAppendP4(Vdbe *
8c00: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e  p, void *pP4, in
8c10: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  t n){.  VdbeOp *
8c20: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pOp;.  assert( n
8c30: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21  !=P4_INT32 && n!
8c40: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73  =P4_VTAB );.  as
8c50: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20  sert( n<=0 );.  
8c60: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
8c70: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
8c80: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20  reeP4(p->db, n, 
8c90: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pP4);.  }else{. 
8ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d     assert( pP4!=
8cb0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8cc0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
8cd0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
8ce0: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73  ->nOp-1];.    as
8cf0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
8d00: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b  e==P4_NOTUSED );
8d10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
8d20: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = n;.    pOp->p
8d30: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d  4.p = pP4;.  }.}
8d40: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
8d50: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
8d60: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70  ecently added op
8d70: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49  code to the KeyI
8d80: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  nfo for the.** i
8d90: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  ndex given..*/.v
8da0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
8db0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73  etP4KeyInfo(Pars
8dc0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
8dd0: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20   *pIdx){.  Vdbe 
8de0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8df0: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  be;.  KeyInfo *p
8e00: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72  KeyInfo;.  asser
8e10: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
8e20: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
8e30: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
8e40: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
8e50: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
8e60: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
8e70: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70   ) sqlite3VdbeAp
8e80: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
8e90: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8ea0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8eb0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
8ec0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
8ed0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
8ee0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
8ef0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
8f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
8f10: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
8f20: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
8f30: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
8f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
8f50: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
8f60: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
8f70: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
8f80: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
8f90: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
8fa0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
8fb0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
8fc0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
8fd0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
8fe0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
8ff0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
9000: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
9010: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
9020: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
9030: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
9040: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
9050: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
9060: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9070: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
9080: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
9090: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
90a0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
90b0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
90c0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
90d0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
90e0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
90f0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
9100: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
9110: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
9120: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
9130: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
9140: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
9150: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
9160: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
9170: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
9180: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
9190: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
91a0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
91b0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
91c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
91d0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
91e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
91f0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
9200: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
9210: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
9220: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
9230: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
9240: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
9250: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
9260: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
9270: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
9280: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
9290: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
92a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
92b0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
92c0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
92d0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
92e0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
92f0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
9300: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
9310: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9320: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
9330: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
9340: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
9350: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
9360: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
9370: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9380: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
9390: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
93a0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
93b0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
93c0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
93d0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
93e0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
93f0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
9400: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
9410: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
9420: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
9430: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
9440: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
9450: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
9460: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
9470: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
9480: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
9490: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
94a0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
94b0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
94c0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
94d0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
94e0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
94f0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
9500: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
9510: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
9520: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
9530: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
9540: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
9550: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
9560: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
9570: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
9580: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9590: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
95a0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
95b0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
95c0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
95d0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
95e0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
95f0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
9600: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
9610: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
9620: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
9630: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
9640: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
9650: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
9660: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
9670: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
9680: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
9690: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
96a0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
96b0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
96c0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
96d0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
96e0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
96f0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
9700: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
9710: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
9720: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
9730: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
9740: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
9750: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
9760: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
9770: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
9780: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
9790: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
97a0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
97b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
97c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
97d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
97e0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
97f0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
9800: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
9810: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
9820: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
9830: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9840: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
9850: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
9860: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
9870: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
9880: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
9890: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
98a0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
98b0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
98c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
98d0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
98e0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
98f0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
9900: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
9910: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
9920: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
9930: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
9940: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
9950: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
9960: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
9970: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
9980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
9990: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
99a0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
99b0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
99c0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
99d0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
99e0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
99f0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
9a00: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
9a10: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
9a20: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
9a30: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
9a40: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
9a50: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
9a60: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
9a70: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
9a80: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
9a90: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
9aa0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
9ab0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
9ac0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
9ad0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
9ae0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
9af0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
9b00: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
9b10: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
9b20: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
9b30: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
9b40: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
9b50: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
9b60: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
9b70: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
9b80: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
9b90: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
9ba0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
9bb0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
9bc0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
9bd0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
9be0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
9bf0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
9c00: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
9c10: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
9c20: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
9c30: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
9c40: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
9c50: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
9c60: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
9c70: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9c80: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
9c90: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
9ca0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
9cb0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9cc0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
9cd0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
9ce0: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a  ii, jj;.  char z
9cf0: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61  Alt[50];.  zOpNa
9d00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
9d10: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
9d20: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
9d30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
9d40: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
9d50: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
9d60: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
9d70: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
9d80: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
9d90: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
9da0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
9db0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
9dc0: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c  zSynopsis,"IF ",
9dd0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  3)==0 ){.      i
9de0: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
9df0: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20  ITE_STOREP2 ){. 
9e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9e10: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
9e20: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50  Alt), zAlt, "r[P
9e30: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e  2] = (%s)", zSyn
9e40: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20  opsis+3);.      
9e50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9e60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9e70: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
9e80: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20  lt, "if %s goto 
9e90: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33  P2", zSynopsis+3
9ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9eb0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c   zSynopsis = zAl
9ec0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  t;.    }.    for
9ed0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
9ee0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
9ef0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
9f00: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
9f10: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
9f20: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
9f30: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
9f40: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
9f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9f60: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
9f70: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
9f80: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
9f90: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
9fa0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
9fb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9fc0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9fd0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
9fe0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
9ff0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
a000: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a010: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
a020: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
a030: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
a040: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
a050: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
a060: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
a070: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
a080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
a090: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
a0a0: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
a0b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a0c0: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
a0d0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
a0e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a0f0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
a100: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
a110: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
a120: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
a130: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
a140: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
a150: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
a170: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
a180: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
a190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a1a0: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
a1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a1c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a1d0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
a1e0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
a1f0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
a200: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
a210: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
a220: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
a230: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
a240: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
a250: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
a260: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
a270: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a280: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
a290: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
a2a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a2b0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
a2c0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
a2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
a2e0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
a2f0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
a300: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
a310: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a320: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
a330: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
a340: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
a350: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
a360: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
a370: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
a380: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
a390: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
a3a0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
a3b0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
a3c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
a3d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
a3e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
a3f0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
a400: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
a410: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a420: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
a430: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
a440: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
a450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
a460: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
a470: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
a480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
a490: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
a4a0: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
a4b0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
a4c0: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
a4d0: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
a4e0: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
a4f0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
a500: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
a510: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
a520: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
a530: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
a540: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
a550: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
a560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a570: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
a580: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
a590: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
a5a0: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
a5b0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
a5c0: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
a5d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
a5e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a5f0: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
a600: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a610: 6e 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78  ndf(p, "%d", pEx
a620: 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
a630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a640: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
a650: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a660: 61 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c  appendf(p, "NULL
a670: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
a680: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
a690: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
a6a0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a6b0: 64 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  df(p, "r[%d]", p
a6c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
a6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a6e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
a6f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
a700: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
a710: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
a720: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
a730: 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20  f(p, "rowid");. 
a740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a750: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a760: 61 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22  appendf(p, "c%d"
a770: 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43  , (int)pExpr->iC
a780: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
a790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
a7b0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c  T:      zOp = "L
a7c0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
a7d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
a7e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b       zOp = "LE";
a7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a800: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
a810: 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20    zOp = "GT";   
a820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a830: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
a840: 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20  Op = "GE";      
a850: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a860: 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_NE:      zOp 
a870: 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65  = "NE";      bre
a880: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a890: 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  EQ:      zOp = "
a8a0: 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  EQ";      break;
a8b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
a8c0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22        zOp = "IS"
a8d0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
a8e0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
a8f0: 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22     zOp = "ISNOT"
a900: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a910: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20  ase TK_AND:     
a920: 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20  zOp = "AND";    
a930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a940: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70   TK_OR:      zOp
a950: 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72   = "OR";      br
a960: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a970: 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20  _PLUS:    zOp = 
a980: 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "ADD";     break
a990: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
a9a0: 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55  AR:    zOp = "MU
a9b0: 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  L";     break;. 
a9c0: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
a9d0: 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b  :   zOp = "SUB";
a9e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a9f0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
aa00: 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20   zOp = "REM";   
aa10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
aa20: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f  e TK_BITAND:  zO
aa30: 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62  p = "BITAND";  b
aa40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
aa50: 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d  K_BITOR:   zOp =
aa60: 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61   "BITOR";   brea
aa70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
aa80: 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44  LASH:   zOp = "D
aa90: 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  IV";     break;.
aaa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
aab0: 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49  FT:  zOp = "LSHI
aac0: 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  FT";  break;.   
aad0: 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
aae0: 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22    zOp = "RSHIFT"
aaf0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
ab00: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
ab10: 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20  Op = "CONCAT";  
ab20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ab30: 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20  TK_UMINUS:  zOp 
ab40: 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65  = "MINUS";   bre
ab50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ab60: 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22  UPLUS:   zOp = "
ab70: 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b  PLUS";    break;
ab80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
ab90: 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54  NOT:  zOp = "BIT
aba0: 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
abb0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
abc0: 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20     zOp = "NOT"; 
abd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
abe0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
abf0: 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  zOp = "ISNULL"; 
ac00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
ac10: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70   TK_NOTNULL: zOp
ac20: 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
ac30: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
ac40: 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t:.      sqlite3
ac50: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20  _str_appendf(p, 
ac60: 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20  "%s", "expr");. 
ac70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
ac80: 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20  .  if( zOp ){.  
ac90: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
aca0: 70 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20  pendf(p, "%s(", 
acb0: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
acc0: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
acd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
ace0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
acf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ad00: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
ad10: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
ad20: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
ad30: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ad40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ad50: 5f 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22  _str_append(p, "
ad60: 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65  )", 1);.  }.}.#e
ad70: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53  ndif /* VDBE_DIS
ad80: 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e  PLAY_P4 && defin
ad90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
ada0: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a  _CURSOR_HINTS) *
adb0: 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53  /...#if VDBE_DIS
adc0: 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f  PLAY_P4./*.** Co
add0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
ade0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
adf0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
ae00: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
ae10: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
ae20: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
ae30: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
ae40: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
ae50: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
ae60: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
ae70: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
ae80: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
ae90: 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  emp;.  StrAccum 
aea0: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  x;.  assert( nTe
aeb0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69  mp>=20 );.  sqli
aec0: 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
aed0: 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54  &x, 0, zTemp, nT
aee0: 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63  emp, 0);.  switc
aef0: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  h( pOp->p4type )
af00: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  {.    case P4_KE
af10: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
af20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  nt j;.      KeyI
af30: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
af40: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
af50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
af60: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
af70: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
af80: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
af90: 65 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c  endf(&x, "k(%d",
afa0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46   pKeyInfo->nKeyF
afb0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ield);.      for
afc0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
afd0: 2d 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b  ->nKeyField; j++
afe0: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
aff0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
b000: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
b010: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
b020: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
b030: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
b040: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
b050: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
b060: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
b070: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
b080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b090: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25  _appendf(&x, ",%
b0a0: 73 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s%s", .         
b0b0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
b0c0: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20  aSortOrder[j] ? 
b0d0: 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29  "-" : "", zColl)
b0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b0f0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b100: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
b110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b120: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
b130: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
b140: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
b150: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
b160: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
b170: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
b180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b190: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
b1a0: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
b1b0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
b1c0: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
b1d0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
b1e0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b1f0: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
b200: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
b210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b220: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
b230: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
b240: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
b250: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
b260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b270: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
b280: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
b290: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
b2a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b2b0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
b2c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
b2d0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
b2e0: 4f 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20  OFILE).    case 
b2f0: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
b300: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
b310: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78  f = pOp->p4.pCtx
b320: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  ->pFunc;.      s
b330: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b340: 64 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  df(&x, "%s(%d)",
b350: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
b360: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
b370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b380: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
b390: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
b3a0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
b3b0: 6e 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20  ndf(&x, "%lld", 
b3c0: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
b3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
b3f0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
b400: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
b410: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
b420: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
b430: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b440: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b460: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
b470: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
b480: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
b490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b4a0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
b4b0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
b4c0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
b4d0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
b4e0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
b4f0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
b500: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
b510: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
b520: 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
b530: 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20  M_IntReal) ){.  
b540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
b550: 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  r_appendf(&x, "%
b560: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
b570: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
b580: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
b590: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
b5a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b5b0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31  appendf(&x, "%.1
b5c0: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
b5d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
b5e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
b5f0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
b600: 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b     zP4 = "NULL";
b610: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
b630: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
b640: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
b650: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
b660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b670: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b680: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b690: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
b6a0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
b6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
b6c0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
b6d0: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
b6e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
b6f0: 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20  str_appendf(&x, 
b700: 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62  "vtab:%p", pVtab
b710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b720: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b730: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
b740: 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y: {.      int i
b750: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20  ;.      int *ai 
b760: 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20  = pOp->p4.ai;.  
b770: 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30      int n = ai[0
b780: 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  ];   /* The firs
b790: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20  t element of an 
b7a0: 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77 61  INTARRAY is alwa
b7b0: 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ys the.         
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
b7d0: 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
b7e0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
b7f0: 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
b800: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
b810: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
b820: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
b830: 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22 2c 20  endf(&x, ",%d", 
b840: 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ai[i]);.      }.
b850: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
b860: 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69   '[';.      sqli
b870: 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26  te3_str_append(&
b880: 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20  x, "]", 1);.    
b890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b8a0: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
b8b0: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
b8c0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
b8d0: 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22  df(&x, "program"
b8e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b8f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
b900: 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 63  4_DYNBLOB:.    c
b910: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
b920: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
b930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
b940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b950: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20  e P4_TABLE: {.  
b960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
b970: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 22  appendf(&x, "%s"
b980: 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d 3e  , pOp->p4.pTab->
b990: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
b9a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
b9b0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b9c0: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
b9d0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
b9e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
b9f0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
ba00: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
ba10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ba20: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
ba30: 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a 20  cumFinish(&x);. 
ba40: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
ba50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
ba60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42  .}.#endif /* VDB
ba70: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a  E_DISPLAY_P4 */.
ba80: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
ba90: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
baa0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
bab0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
bac0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
bad0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
bae0: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
baf0: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
bb00: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
bb10: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
bb20: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
bb30: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
bb40: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
bb50: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
bb60: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
bb70: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
bb80: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
bb90: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
bba0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
bbb0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
bbc0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
bbd0: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
bbe0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
bbf0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
bc00: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
bc10: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
bc20: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
bc30: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
bc40: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
bc50: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
bc60: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44  eeMask)*8 );.  D
bc70: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65  bMaskSet(p->btre
bc80: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28  eMask, i);.  if(
bc90: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
bca0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
bcb0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
bcc0: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
bcd0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69  t(p->lockMask, i
bce0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  );.  }.}..#if !d
bcf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bd00: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
bd10: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
bd20: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
bd30: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
bd40: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
bd50: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
bd60: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
bd70: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
bd80: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
bd90: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
bda0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
bdb0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
bdc0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
bdd0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
bde0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
bdf0: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
be00: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
be10: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
be20: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
be30: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
be40: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
be50: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
be60: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
be70: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
be80: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
be90: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
bea0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
beb0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
bec0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
bed0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
bee0: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
bef0: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
bf00: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
bf10: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
bf20: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
bf30: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
bf40: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
bf50: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
bf60: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
bf70: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
bf80: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
bf90: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
bfa0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
bfb0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
bfc0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
bfd0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
bfe0: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
bff0: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
c000: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
c010: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
c020: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
c030: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
c040: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
c050: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
c060: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
c070: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
c080: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
c090: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
c0a0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
c0b0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
c0c0: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
c0d0: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
c0e0: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
c0f0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
c100: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
c110: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c120: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
c130: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
c140: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
c150: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
c160: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
c170: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
c180: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
c190: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
c1a0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
c1b0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
c1c0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
c1d0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
c1e0: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
c1f0: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
c200: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
c210: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
c220: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
c230: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
c240: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
c250: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
c260: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
c270: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c280: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
c290: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
c2a0: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
c2b0: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
c2c0: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
c2d0: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
c2e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c2f0: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74  beEnter()..*/.st
c300: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
c310: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65  LINE void vdbeLe
c320: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
c330: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
c340: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
c350: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62  .  int nDb;.  db
c360: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
c370: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
c380: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
c390: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
c3a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
c3b0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
c3c0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
c3d0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
c3e0: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
c3f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
c400: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
c410: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
c420: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
c430: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
c440: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
c450: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
c460: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
c470: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76  mmon case */.  v
c480: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23  dbeLeave(p);.}.#
c490: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
c4a0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
c4b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
c4c0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
c4d0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
c4e0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
c4f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
c500: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c510: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c520: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
c530: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
c540: 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  VdbeOp *pOp){.  
c550: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
c560: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
c570: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
c580: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c590: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
c5a0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
c5b0: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
c5c0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
c5d0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
c5e0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
c5f0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
c600: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
c610: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c620: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
c630: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
c640: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
c650: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
c660: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
c670: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
c680: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
c690: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
c6a0: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
c6b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
c6c0: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
c6d0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
c6e0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
c6f0: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
c700: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
c710: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
c720: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
c730: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
c740: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
c750: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
c760: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
c770: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
c780: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
c790: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
c7a0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
c7b0: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
c7c0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
c7d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c7e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
c7f0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
c800: 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  lement..*/.stati
c810: 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41 72  c void initMemAr
c820: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
c830: 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  N, sqlite3 *db, 
c840: 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77 68  u16 flags){.  wh
c850: 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b 0a  ile( (N--)>0 ){.
c860: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
c870: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66      p->flags = f
c880: 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d  lags;.    p->szM
c890: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64 65  alloc = 0;.#ifde
c8a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
c8b0: 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f 6d     p->pScopyFrom
c8c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
c8d0: 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   p++;.  }.}../*.
c8e0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
c8f0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
c900: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
c910: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
c920: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
c930: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
c940: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
c950: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
c960: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c970: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  >db;.    if( db-
c980: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
c990: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
c9a0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
c9b0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
c9c0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
c9d0: 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  c);.      }while
c9e0: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
c9f0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ca00: 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
ca10: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
ca20: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
ca30: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20  db==p[1].db );. 
ca40: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
ca50: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
ca60: 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b  Invariants(p) );
ca70: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
ca80: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
ca90: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
caa0: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
cab0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
cac0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
cad0: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
cae0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
caf0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
cb00: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
cb10: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
cb20: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
cb30: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
cb40: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
cb50: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
cb60: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
cb70: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
cb80: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
cb90: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
cba0: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
cbb0: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
cbc0: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
cbd0: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
cbe0: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
cbf0: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
cc00: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
cc10: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
cc20: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
cc30: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
cc40: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
cc50: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
cc60: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
cc70: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
cc80: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
cc90: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
cca0: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
ccb0: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
ccc0: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
ccd0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
cce0: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
ccf0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
cd00: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
cd10: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
cd20: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
cd30: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
cd40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cd50: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
cd60: 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a  gs & MEM_Agg );.
cd70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cd80: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  p->flags & MEM_D
cd90: 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  yn );.      test
cda0: 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d 3d 73  case( p->xDel==s
cdb0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 4d  qlite3VdbeFrameM
cdc0: 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 69  emDel );.      i
cdd0: 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  f( p->flags&(MEM
cde0: 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b  _Agg|MEM_Dyn) ){
cdf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ce00: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
ce10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ce20: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
ce30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ce40: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
ce50: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
ce60: 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d     p->szMalloc =
ce70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
ce80: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
ce90: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
cea0: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
ceb0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  End );.  }.}..#i
cec0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
ced0: 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  G./*.** Verify t
cee0: 68 61 74 20 70 46 72 61 6d 65 20 69 73 20 61 20  hat pFrame is a 
cef0: 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d 65 20  valid VdbeFrame 
cf00: 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75 72 6e  pointer.  Return
cf10: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 0a 2a   true if it is.*
cf20: 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 73  * and false if s
cf30: 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72 6f 6e  omething is wron
cf40: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
cf50: 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 65  utine is intende
cf60: 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 65  d for use inside
cf70: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
cf80: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a 2f  tements only..*/
cf90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
cfa0: 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56 64 62  FrameIsValid(Vdb
cfb0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
cfc0: 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d 3e 69  .  if( pFrame->i
cfd0: 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51 4c 49  FrameMagic!=SQLI
cfe0: 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43 20 29  TE_FRAME_MAGIC )
cff0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
d000: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
d010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
d020: 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 20  a destructor on 
d030: 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28 77 68  a Mem object (wh
d040: 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ich is really an
d050: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 29 0a   sqlite3_value).
d060: 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65 73 20  ** that deletes 
d070: 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65 63 74  the Frame object
d080: 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 65   that is attache
d090: 64 20 74 6f 20 69 74 20 61 73 20 61 20 62 6c 6f  d to it as a blo
d0a0: 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
d0b0: 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 64  utine does not d
d0c0: 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d 65 20  elete the Frame 
d0d0: 72 69 67 68 74 20 61 77 61 79 2e 20 20 49 74 20  right away.  It 
d0e0: 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68 65 0a  merely adds the.
d0f0: 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20 6c 69  ** frame to a li
d100: 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
d110: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
d120: 74 68 65 20 56 64 62 65 20 68 61 6c 74 73 2e 0a  the Vdbe halts..
d130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d140: 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 28 76  dbeFrameMemDel(v
d150: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 56 64  oid *pArg){.  Vd
d160: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 20  beFrame *pFrame 
d170: 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29 70 41  = (VdbeFrame*)pA
d180: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rg;.  assert( sq
d190: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 73  lite3VdbeFrameIs
d1a0: 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20 29 3b  Valid(pFrame) );
d1b0: 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  .  pFrame->pPare
d1c0: 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76 2d 3e  nt = pFrame->v->
d1d0: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70 46 72  pDelFrame;.  pFr
d1e0: 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d  ame->v->pDelFram
d1f0: 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a 0a  e = pFrame;.}...
d200: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56  /*.** Delete a V
d210: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20  dbeFrame object 
d220: 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  and its contents
d230: 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  . VdbeFrame obje
d240: 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  cts are.** alloc
d250: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50  ated by the OP_P
d260: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e  rogram opcode in
d270: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
d280: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
d290: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
d2a0: 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29  te(VdbeFrame *p)
d2b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  {.  int i;.  Mem
d2c0: 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61   *aMem = VdbeFra
d2d0: 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65  meMem(p);.  Vdbe
d2e0: 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d  Cursor **apCsr =
d2f0: 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29   (VdbeCursor **)
d300: 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d  &aMem[p->nChildM
d310: 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  em];.  assert( s
d320: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
d330: 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20 20 66  sValid(p) );.  f
d340: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68  or(i=0; i<p->nCh
d350: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20  ildCsr; i++){.  
d360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d370: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70  eCursor(p->v, ap
d380: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Csr[i]);.  }.  r
d390: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61  eleaseMemArray(a
d3a0: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65  Mem, p->nChildMe
d3b0: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  m);.  sqlite3Vdb
d3c0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
d3d0: 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75  ->v->db, &p->pAu
d3e0: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
d3f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
d400: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
d410: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d420: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
d430: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
d440: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
d450: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
d460: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
d470: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
d480: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
d490: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
d4a0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
d4b0: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
d4c0: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
d4d0: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
d4e0: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
d4f0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
d500: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
d510: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
d520: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
d530: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
d540: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
d550: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
d560: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
d570: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
d580: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
d590: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
d5a0: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
d5b0: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
d5c0: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
d5d0: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
d5e0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
d5f0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
d600: 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30 34 2d  LAN..** 2018-04-
d610: 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70 6c 61  24:  In p->expla
d620: 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68 65 20  in==2 mode, the 
d630: 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 73 20  OP_Init opcodes 
d640: 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 61  of triggers.** a
d650: 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c 20 73  re also shown, s
d660: 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e 64  o that the bound
d670: 61 72 69 65 73 20 62 65 74 77 65 65 6e 20 74 68  aries between th
d680: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
d690: 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69 67 67  nd.** each trigg
d6a0: 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a 2a 2a  er are clear..**
d6b0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
d6c0: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
d6d0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
d6e0: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
d6f0: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
d700: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
d710: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
d720: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
d730: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
d740: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d760: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
d770: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
d7a0: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
d7b0: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
d7c0: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d7f0: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
d800: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
d810: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
d820: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d830: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
d840: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
d850: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
d880: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
d890: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
d8a0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d8d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d8e0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d910: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
d920: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d950: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
d960: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
d970: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
d980: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
d990: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c 69  set */.  int bLi
d9a0: 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28 70 2d  stSubprogs = (p-
d9b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20 28  >explain==1 || (
d9c0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
d9d0: 54 45 5f 54 72 69 67 67 65 72 45 51 50 29 21 3d  TE_TriggerEQP)!=
d9e0: 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20  0);.  Op *pOp = 
d9f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
da00: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73  >explain );.  as
da10: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
da20: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
da30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
da40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
da50: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
da60: 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  SY || p->rc==SQL
da70: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
da80: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
da90: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
daa0: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
dab0: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
dac0: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
dad0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
dae0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
daf0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
db00: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
db10: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
db20: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
db30: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
db40: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
db50: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
db60: 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70  pMem, 8);.  p->p
db70: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a  ResultSet = 0;..
db80: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
db90: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
dba0: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
dbb0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69   if a malloc() i
dbc0: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20  nside a call to 
dbd0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dbe0: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ext() or.    ** 
dbf0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
dc00: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20  ext16() failed. 
dc10: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
dc20: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
dc30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
dc40: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
dc50: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
dc60: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
dc70: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
dc80: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
dc90: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
dca0: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
dcb0: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
dcc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
dcd0: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
dce0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
dcf0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
dd00: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
dd10: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
dd20: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
dd30: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
dd40: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
dd50: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
dd60: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
dd70: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
dd80: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
dd90: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
dda0: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
ddb0: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
ddc0: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
ddd0: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
dde0: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
ddf0: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
de00: 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 70  .  if( bListSubp
de10: 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rogs ){.    /* T
de20: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
de30: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
de40: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
de50: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
de60: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
de70: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
de80: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
de90: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
dea0: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
deb0: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
dec0: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
ded0: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
dee0: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
def0: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
df00: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
df10: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
df20: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
df30: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
df40: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
df50: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
df60: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
df70: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
df80: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
df90: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
dfa0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
dfb0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
dfc0: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
dfd0: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
dfe0: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
dff0: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
e000: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
e010: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
e020: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
e030: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
e040: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
e050: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
e060: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
e070: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
e080: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31 29 7b    }..  while(1){
e090: 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74 73 20    /* Loop exits 
e0a0: 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20 20  via break */.   
e0b0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
e0c0: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
e0d0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
e0f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
e100: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e110: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
e120: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
e130: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
e140: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
e150: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
e160: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
e170: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
e180: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
e190: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
e1a0: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
e1b0: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
e1c0: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
e1d0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
e1e0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
e1f0: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
e200: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
e210: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
e220: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
e230: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
e240: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
e250: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
e260: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
e270: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
e280: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
e290: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
e2a0: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
e2b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e    }..    /* When
e2c0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
e2d0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
e2e0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
e2f0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
e300: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
e310: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
e320: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
e330: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
e340: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 2a  ubprograms.    *
e350: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
e360: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
e370: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
e380: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
e390: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 2a 2a  ubprogram.    **
e3a0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
e3b0: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
e3c0: 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69 73 74  */.    if( bList
e3d0: 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f 70 2d  Subprogs && pOp-
e3e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
e3f0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
e400: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
e410: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
e420: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
e430: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
e440: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
e450: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e460: 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70  apSub[j]==pOp->p
e470: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
e480: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e490: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 29 7b    if( j==nSub ){
e4a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
e4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
e4c0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
e4d0: 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20 20 20   nSub!=0);.     
e4e0: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
e4f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e500: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
e520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e530: 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53 75 62   }.        apSub
e540: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
e550: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
e560: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
e570: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
e580: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70 53 75  ram;.        pSu
e590: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
e5a0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 53  Blob;.        pS
e5b0: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
e5c0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
e5d0: 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2b  ;.        nRow +
e5e0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
e5f0: 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  am->nOp;.      }
e600: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e610: 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20 62 72  ->explain<2 ) br
e620: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  eak;.    if( pOp
e630: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70  ->opcode==OP_Exp
e640: 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  lain ) break;.  
e650: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e660: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 2d  e==OP_Init && p-
e670: 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20  >pc>1 ) break;. 
e680: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
e690: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
e6a0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
e6b0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 20  rrupted ){.     
e6c0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e6d0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20  INTERRUPT;.     
e6e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e6f0: 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
e700: 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71  3VdbeError(p, sq
e710: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
e720: 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c));.    }else{.
e730: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b        char *zP4;
e740: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 78  .      if( p->ex
e750: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
e760: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e770: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
e780: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
e790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
e7c0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
e7d0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 20  Mem++;.    .    
e7e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
e7f0: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
e800: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
e810: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d         pMem->z =
e820: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
e830: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
e840: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
e850: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
e860: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
e870: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
e880: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
e890: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
e8a0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63         pMem->enc
e8b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
e8c0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a          pMem++;.
e8d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
e8e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e8f0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
e900: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
e930: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
e940: 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ..      pMem->fl
e950: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
e960: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
e970: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
e9a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
e9b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e9c0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
e9d0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
e9e0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ea00: 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  3 */.      pMem+
ea10: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  +;..      if( sq
ea20: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
ea30: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
ea40: 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a   100) ){ /* P4 *
ea50: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ea60: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
ea70: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
ea80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
ea90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
eaa0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
eab0: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
eac0: 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  rm;.      zP4 = 
ead0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
eae0: 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a  Mem->z, pMem->sz
eaf0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  Malloc);.      i
eb00: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
eb10: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
eb20: 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
eb30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
eb40: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
eb50: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
eb60: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
eb70: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
eb80: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
eb90: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20          pMem->n 
eba0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ebb0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
ebc0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ebd0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
ebe0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2b     }.      pMem+
ebf0: 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +;..      if( p-
ec00: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
ec10: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
ec20: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
ec30: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
ec40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
ec50: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
ec60: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
ec70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ec80: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ec90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d      }.        pM
eca0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ecb0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
ecc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
ecd0: 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  2;.        sqlit
ece0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
ecf0: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
ed00: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
ed10: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65  5 */.        pMe
ed20: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ed30: 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d  UTF8;.        pM
ed40: 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64 65  em++;.    .#ifde
ed50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ed60: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
ed70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
ed80: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
ed90: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
eda0: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  500) ){.        
edb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
edc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
edd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ede0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
edf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ee00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ee10: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ee20: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
ee30: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
ee40: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
ee50: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
ee60: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ee70: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
ee80: 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  se.        pMem-
ee90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
eea0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
eeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
eec0: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
eed0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
eee0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
eef0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
ef00: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 73  );.      p->pRes
ef10: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
ef20: 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 72  m[1];.      p->r
ef30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ef40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ef50: 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _ROW;.    }.  }.
ef60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
ef70: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ef80: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
ef90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
efa0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
efb0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
efc0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
efd0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
efe0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
eff0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
f000: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
f010: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
f020: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
f030: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
f040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
f050: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
f060: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
f070: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
f080: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
f090: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
f0a0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
f0b0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
f0c0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
f0d0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
f0e0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
f0f0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
f100: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
f110: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
f120: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
f130: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
f140: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
f150: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
f160: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
f170: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
f180: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
f190: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
f1a0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
f1b0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
f1c0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
f1d0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
f1e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
f1f0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
f200: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
f210: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
f220: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
f230: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
f240: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
f250: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
f260: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
f270: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
f280: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
f290: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
f2a0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
f2b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
f2c0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
f2d0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
f2e0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
f2f0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
f300: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
f310: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
f320: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
f330: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
f340: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
f350: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f360: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
f370: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
f380: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
f390: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
f3a0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
f3b0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
f3c0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
f3d0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
f3e0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
f3f0: 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  E */../* An inst
f400: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
f410: 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75  ect describes bu
f420: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
f430: 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62  ble for use.** b
f440: 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20  y subcomponents 
f450: 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74  of a prepared st
f460: 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20  atement.  Space 
f470: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74  is allocated out
f480: 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c  .** of a Reusabl
f490: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79  eSpace object by
f4a0: 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28   the allocSpace(
f4b0: 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e  ) routine below.
f4c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61  .*/.struct Reusa
f4d0: 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20  bleSpace {.  u8 
f4e0: 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  *pSpace;        
f4f0: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65      /* Available
f500: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 73 71 6c   memory */.  sql
f510: 69 74 65 33 5f 69 6e 74 36 34 20 6e 46 72 65 65  ite3_int64 nFree
f520: 3b 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20  ;   /* Bytes of 
f530: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
f540: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
f550: 74 36 34 20 6e 4e 65 65 64 65 64 3b 20 2f 2a 20  t64 nNeeded; /* 
f560: 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74  Total bytes that
f570: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
f580: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
f590: 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74  * Try to allocat
f5a0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
f5b0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
f5c0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  bulk memory for 
f5d0: 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  pBuf.** from the
f5e0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
f5f0: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
f600: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
f610: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d  allocated.** mem
f620: 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ory on success. 
f630: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
f640: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
f650: 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52  able in the.** R
f660: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
f670: 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ect, increase th
f680: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e  e ReusableSpace.
f690: 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65  nNeeded.** value
f6a0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e   by the amount n
f6b0: 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eeded and return
f6c0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
f6d0: 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74  pBuf is not init
f6e0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74  ially NULL, that
f6f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
f700: 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61  memory has alrea
f710: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
f720: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
f730: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
f740: 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65  tine, so just re
f750: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
f760: 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65  f pBuf and leave
f770: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75   ReusableSpace u
f780: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
f790: 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69  This allocator i
f7a0: 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65  s employed to re
f7b0: 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73  purpose unused s
f7c0: 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20  lots at the end 
f7d0: 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  of the.** opcode
f7e0: 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72   array of prepar
f7f0: 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68  ed state for oth
f800: 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20  er memory needs 
f810: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a  of the prepared.
f820: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ** statement..*/
f830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
f840: 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75  locSpace(.  stru
f850: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
f860: 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65   *p,  /* Bulk me
f870: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
f880: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
f890: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8b0: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69  Pointer to a pri
f8c0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
f8d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
f8e0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 2f 2a 20   nByte       /* 
f8f0: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
f900: 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  needed */.){.  a
f910: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
f920: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70  E_ALIGNMENT(p->p
f930: 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20  Space) );.  if( 
f940: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  pBuf==0 ){.    n
f950: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
f960: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
f970: 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20  yte <= p->nFree 
f980: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  ){.      p->nFre
f990: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e -= nByte;.    
f9a0: 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70    pBuf = &p->pSp
f9b0: 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20  ace[p->nFree];. 
f9c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f9d0: 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42  p->nNeeded += nB
f9e0: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
f9f0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
fa00: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
fa10: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
fa20: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
fa30: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
fa40: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
fa50: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
fa60: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
fa70: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
fa80: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
fa90: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
faa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
fab0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
fac0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
fad0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
fae0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
faf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
fb00: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
fb10: 4e 49 54 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  NIT || p->magic=
fb20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45  =VDBE_MAGIC_RESE
fb30: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
fb40: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
fb50: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
fb60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
fb70: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
fb80: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
fb90: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
fba0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
fbb0: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
fbc0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
fbd0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
fbe0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
fbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
fc00: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
fc10: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
fc20: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
fc30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
fc40: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
fc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fc60: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
fc70: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
fc80: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
fc90: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
fca0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
fcb0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
fcc0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
fcd0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
fce0: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
fcf0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
fd00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
fd10: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
fd20: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
fd30: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
fd40: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
fd50: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
fd60: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
fd70: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
fd80: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
fd90: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
fda0: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
fdb0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
fdc0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
fdd0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
fde0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
fdf0: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
fe00: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
fe10: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
fe20: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
fe30: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
fe40: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
fe50: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
fe60: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
fe70: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
fe80: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
fe90: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
fea0: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
feb0: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
fec0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
fed0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
fee0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
fef0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
ff00: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
ff10: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
ff20: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
ff30: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
ff40: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
ff50: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
ff60: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
ff70: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
ff80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
ff90: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
ffa0: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
ffb0: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
ffc0: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
ffd0: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
ffe0: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
fff0: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
10000 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
10010 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
10020 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
10030 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
10040 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
10050 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
10060 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
10070 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
10080 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
10090 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
100a0 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
100b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
100c0 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
100d0 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
100f0 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
10100 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10120 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10130 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
10140 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
10150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10160 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10170 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
10180 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
10190 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
101a0 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
101b0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
101e0 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
101f0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
10200 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
10210 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10220 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
10230 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
10240 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
10250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10260 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
10270 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
10280 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
102b0 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  nter */.  struct
102c0 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 78   ReusableSpace x
102d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;        /* Reus
102e0 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  able bulk memory
102f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10300 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10310 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
10320 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
10330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
10340 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
10350 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
10360 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e  ert( pParse==p->
10370 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d  pParse );.  db =
10380 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
10390 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
103a0 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
103b0 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
103c0 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
103d0 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
103e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
103f0 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
10400 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20  ->nMaxArg;.  .  
10410 2f 2a 20 45 61 63 68 20 63 75 72 73 6f 72 20 75  /* Each cursor u
10420 73 65 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ses a memory cel
10430 6c 2e 20 20 54 68 65 20 66 69 72 73 74 20 63 75  l.  The first cu
10440 72 73 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20  rsor (cursor 0) 
10450 63 61 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65  can.  ** use aMe
10460 6d 5b 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f  m[0] which is no
10470 74 20 6f 74 68 65 72 77 69 73 65 20 75 73 65 64  t otherwise used
10480 20 62 79 20 74 68 65 20 56 44 42 45 20 70 72 6f   by the VDBE pro
10490 67 72 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a  gram.  Allocate.
104a0 20 20 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68    ** space at th
104b0 65 20 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20  e end of aMem[] 
104c0 66 6f 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e  for cursors 1 an
104d0 64 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20  d greater..  ** 
104e0 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
104f0 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
10500 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
10510 6f 72 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f  or;.  if( nCurso
10520 72 3d 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29  r==0 && nMem>0 )
10530 20 6e 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61   nMem++;  /* Spa
10540 63 65 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65  ce for aMem[0] e
10550 76 65 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20  ven if not used 
10560 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
10570 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75  out how much reu
10580 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20  sable memory is 
10590 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65  available at the
105a0 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
105b0 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
105c0 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72  This extra memor
105d0 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f  y will be reallo
105e0 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20  cated for other 
105f0 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  elements.  ** of
10600 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
10610 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
10620 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  n = ROUND8(sizeo
10630 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20  f(Op)*p->nOp);  
10640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
10650 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d  ytes of opcode m
10660 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20  emory used */.  
10670 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28 75 38  x.pSpace = &((u8
10680 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20  *)p->aOp)[n];   
10690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
106a0 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d  nused opcode mem
106b0 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
106c0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
106d0 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20  NMENT(x.pSpace) 
106e0 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52  );.  x.nFree = R
106f0 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65  OUNDDOWN8(pParse
10700 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29  ->szOpAlloc - n)
10710 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75  ;  /* Bytes of u
10720 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  nused memory */.
10730 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65    assert( x.nFre
10740 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e>=0 );.  assert
10750 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
10760 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65  GNMENT(&x.pSpace
10770 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 0a 20  [x.nFree]) );.. 
10780 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
10790 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
107a0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
107b0 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
107c0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
107d0 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
107e0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
107f0 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
10800 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
10810 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65  = 10;.  }.  p->e
10820 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  xpired = 0;..  /
10830 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
10840 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
10850 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
10860 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
10870 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a   one or two.  **
10880 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
10890 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
108a0 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
108b0 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  sed memory at th
108c0 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
108d0 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
108e0 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
108f0 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
10900 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
10910 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
10920 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
10930 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
10940 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
10950 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
10960 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
10970 72 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  r using a fresh 
10980 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
10990 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
109a0 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
109b0 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
109c0 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
109d0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
109e0 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
109f0 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  ver memory at th
10a00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
10a10 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
10a20 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
10a30 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
10a40 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
10a50 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
10a60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
10a70 2e 0a 20 20 2a 2f 0a 20 20 78 2e 6e 4e 65 65 64  ..  */.  x.nNeed
10a80 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 4d 65  ed = 0;.  p->aMe
10a90 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  m = allocSpace(&
10aa0 78 2c 20 30 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  x, 0, nMem*sizeo
10ab0 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61 56  f(Mem));.  p->aV
10ac0 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
10ad0 26 78 2c 20 30 2c 20 6e 56 61 72 2a 73 69 7a 65  &x, 0, nVar*size
10ae0 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 2d 3e 61  of(Mem));.  p->a
10af0 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
10b00 65 28 26 78 2c 20 30 2c 20 6e 41 72 67 2a 73 69  e(&x, 0, nArg*si
10b10 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 70  zeof(Mem*));.  p
10b20 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
10b30 70 61 63 65 28 26 78 2c 20 30 2c 20 6e 43 75 72  pace(&x, 0, nCur
10b40 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
10b50 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
10b60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10b70 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
10b80 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
10b90 6f 63 53 70 61 63 65 28 26 78 2c 20 30 2c 20 70  ocSpace(&x, 0, p
10ba0 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
10bb0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ));.#endif.  if(
10bc0 20 78 2e 6e 4e 65 65 64 65 64 20 29 7b 0a 20 20   x.nNeeded ){.  
10bd0 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e    x.pSpace = p->
10be0 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
10bf0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
10c00 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20   x.nNeeded);.   
10c10 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65   x.nFree = x.nNe
10c20 65 64 65 64 3b 0a 20 20 20 20 69 66 28 20 21 64  eded;.    if( !d
10c30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10c40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
10c50 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
10c60 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  , p->aMem, nMem*
10c70 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
10c80 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
10c90 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
10ca0 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
10cb0 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 70  f(Mem));.      p
10cc0 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
10cd0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72  pace(&x, p->apAr
10ce0 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
10cf0 65 6d 2a 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e  em*));.      p->
10d00 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
10d10 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c  ce(&x, p->apCsr,
10d20 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
10d30 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
10d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10d50 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
10d60 54 55 53 0a 20 20 20 20 20 20 70 2d 3e 61 6e 45  TUS.      p->anE
10d70 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
10d80 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
10d90 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
10da0 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
10db0 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 56 4c 69  }.  }..  p->pVLi
10dc0 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 4c  st = pParse->pVL
10dd0 69 73 74 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  ist;.  pParse->p
10de0 56 4c 69 73 74 20 3d 20 20 30 3b 0a 20 20 70 2d  VList =  0;.  p-
10df0 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73  >explain = pPars
10e00 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 69 66  e->explain;.  if
10e10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
10e20 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ed ){.    p->nVa
10e30 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 43  r = 0;.    p->nC
10e40 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
10e50 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 7d 65  ->nMem = 0;.  }e
10e60 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43 75 72  lse{.    p->nCur
10e70 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
10e80 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
10e90 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 69 6e  Var)nVar;.    in
10ea0 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  itMemArray(p->aV
10eb0 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20 4d 45  ar, nVar, db, ME
10ec0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  M_Null);.    p->
10ed0 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  nMem = nMem;.   
10ee0 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d   initMemArray(p-
10ef0 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64 62 2c  >aMem, nMem, db,
10f00 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 29 3b   MEM_Undefined);
10f10 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61  .    memset(p->a
10f20 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73 6f 72  pCsr, 0, nCursor
10f30 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
10f40 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51  or*));.#ifdef SQ
10f50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
10f60 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
10f70 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78 65 63  memset(p->anExec
10f80 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65  , 0, p->nOp*size
10f90 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66  of(i64));.#endif
10fa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
10fb0 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
10fc0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
10fd0 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
10fe0 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
10ff0 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
11000 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
11010 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
11020 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
11030 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
11040 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
11050 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
11060 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
11070 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  }.  assert( pCx-
11080 3e 70 42 74 78 3d 3d 30 20 7c 7c 20 70 43 78 2d  >pBtx==0 || pCx-
11090 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
110a0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77  PE_BTREE );.  sw
110b0 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54  itch( pCx->eCurT
110c0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
110d0 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20  CURTYPE_SORTER: 
110e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
110f0 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
11100 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20  ->db, pCx);.    
11110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11120 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
11130 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69  BTREE: {.      i
11140 66 28 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65  f( pCx->isEpheme
11150 72 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ral ){.        i
11160 66 28 20 70 43 78 2d 3e 70 42 74 78 20 29 20 73  f( pCx->pBtx ) s
11170 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
11180 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20  (pCx->pBtx);.   
11190 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d       /* The pCx-
111a0 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
111b0 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
111c0 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
111d0 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ts, by.        *
111e0 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
111f0 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  . */.      }else
11200 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
11210 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  ( pCx->uc.pCurso
11220 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
11230 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
11240 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e  eCursor(pCx->uc.
11250 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
11260 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11270 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11280 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11290 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43  TABLE.    case C
112a0 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20  URTYPE_VTAB: {. 
112b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
112c0 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20  b_cursor *pVCur 
112d0 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b  = pCx->uc.pVCur;
112e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  .      const sql
112f0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
11300 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56  dule = pVCur->pV
11310 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
11320 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75      assert( pVCu
11330 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30  r->pVtab->nRef>0
11340 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d   );.      pVCur-
11350 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a  >pVtab->nRef--;.
11360 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78        pModule->x
11370 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20  Close(pVCur);.  
11380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11390 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
113a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
113b0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75  ursors in the cu
113c0 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a  rrent frame..*/.
113d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
113e0 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
113f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
11400 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
11410 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
11420 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
11430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
11440 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
11450 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
11460 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
11470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
11480 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
11490 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
114a0 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
114b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
114c0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
114d0 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
114e0 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
114f0 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
11500 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
11510 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
11520 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
11530 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
11540 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
11550 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
11560 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
11570 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
11580 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
11590 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
115a0 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
115b0 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63  = pFrame->v;.  c
115c0 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
115d0 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51  me(v);.#ifdef SQ
115e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
115f0 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d  _SCANSTATUS.  v-
11600 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65  >anExec = pFrame
11610 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66  ->anExec;.#endif
11620 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
11630 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
11640 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
11650 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
11660 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
11670 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
11680 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
11690 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
116a0 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
116b0 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
116c0 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
116d0 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
116e0 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
116f0 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
11700 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62  nChange;.  v->db
11710 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
11720 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20  me->nDbChange;. 
11730 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
11740 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62 2c  teAuxData(v->db,
11750 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &v->pAuxData, -
11760 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78  1, 0);.  v->pAux
11770 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70  Data = pFrame->p
11780 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61 6d  AuxData;.  pFram
11790 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30 3b  e->pAuxData = 0;
117a0 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
117b0 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
117c0 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
117d0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
117e0 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
117f0 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
11800 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
11810 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
11820 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
11830 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
11840 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
11850 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
11860 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
11870 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
11880 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
11890 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
118a0 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
118b0 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
118c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
118d0 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
118e0 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
118f0 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
11900 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
11910 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
11920 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
11930 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
11940 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
11950 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
11960 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
11970 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70  e(pFrame);.    p
11980 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
11990 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
119a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
119b0 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20  ->nFrame==0 );. 
119c0 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
119d0 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70  rame(p);.  if( p
119e0 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
119f0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
11a00 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  >aMem, p->nMem);
11a10 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
11a20 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
11a30 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
11a40 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
11a50 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
11a60 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
11a70 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
11a80 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
11a90 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
11aa0 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
11ab0 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
11ac0 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
11ad0 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61  .  if( p->pAuxDa
11ae0 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ta ) sqlite3Vdbe
11af0 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
11b00 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
11b10 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  a, -1, 0);.  ass
11b20 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
11b30 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
11b40 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
11b50 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
11b60 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
11b70 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
11b80 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
11b90 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
11ba0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
11bb0 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
11bc0 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
11bd0 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
11be0 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
11bf0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
11c00 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
11c10 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
11c20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
11c30 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
11c40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11c50 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
11c60 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
11c70 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 6e  Column){.  int n
11c80 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
11c90 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  = p->db;..  if( 
11ca0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 7b  p->nResColumn ){
11cb0 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
11cc0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
11cd0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
11ce0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 20 20  COLNAME_N);.    
11cf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11d00 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
11d10 20 20 7d 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f    }.  n = nResCo
11d20 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
11d30 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
11d40 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
11d50 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
11d60 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
11d70 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
11d80 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
11d90 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
11da0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
11db0 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  ;.  initMemArray
11dc0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c  (p->aColName, n,
11dd0 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   db, MEM_Null);.
11de0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11df0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
11e00 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
11e10 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
11e20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
11e30 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
11e40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
11e50 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
11e60 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
11e70 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
11e80 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
11e90 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
11ea0 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
11eb0 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
11ec0 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
11ed0 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
11ee0 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
11ef0 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
11f00 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
11f10 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
11f20 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
11f30 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
11f40 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
11f50 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
11f60 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
11f70 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
11f80 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
11f90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11fa0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
11fb0 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
11fe0 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
11ff0 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
12020 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
12030 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
12040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
12060 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
12070 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
12080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
12090 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
120a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
120b0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
120c0 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
120d0 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120f0 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
12100 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
12110 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
12120 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
12130 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
12140 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
12150 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
12160 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
12170 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
12180 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12190 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
121a0 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
121b0 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
121c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
121d0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  EM_BKPT;.  }.  a
121e0 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
121f0 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
12200 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
12210 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
12220 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
12230 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
12240 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
12250 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
12260 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
12270 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
12280 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
12290 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
122a0 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
122b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
122c0 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
122d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
122e0 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
122f0 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
12300 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
12310 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
12320 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
12330 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
12340 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
12350 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
12360 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
12370 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
12380 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
12390 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
123a0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
123b0 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
123c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
123d0 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
123e0 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
123f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
12400 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
12410 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
12420 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
12430 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
12440 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
12450 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61         ** that a
12460 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  re candidates fo
12470 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  r a two-phase co
12480 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20  mmit using a.   
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
124b0 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  l */.  int rc = 
124c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
124d0 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
124e0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
124f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12500 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
12510 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
12520 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
12530 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
12540 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
12550 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
12560 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
12570 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12580 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12590 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
125a0 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
125b0 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
125c0 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
125d0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
125e0 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
125f0 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
12600 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
12610 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
12620 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
12630 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
12640 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
12650 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
12660 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
12670 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
12680 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
12690 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
126a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
126b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
126c0 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
126d0 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
126e0 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
126f0 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
12700 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
12710 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
12720 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
12730 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
12740 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
12750 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
12760 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
12770 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
12780 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
12790 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
127a0 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
127b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
127c0 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
127d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
127e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
127f0 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
12800 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
12810 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
12820 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
12830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
12840 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
12850 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
12860 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
12870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12880 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
12890 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
128a0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
128b0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 20   database might 
128c0 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  need a master jo
128d0 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70  urnal depends up
128e0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20  on.      ** its 
128f0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d  journal mode (am
12900 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73  ong other things
12910 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78 20  ).  This matrix 
12920 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
12930 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
12940 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61  l modes use a ma
12950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
12960 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f   which do not */
12970 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
12980 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64  nst u8 aMJNeeded
12990 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
129a0 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31  * DELETE   */  1
129b0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52  ,.        /* PER
129c0 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20  SIST   */ 1,.   
129d0 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20       /* OFF     
129e0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
129f0 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20  /* TRUNCATE  */ 
12a00 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45  1,.        /* ME
12a10 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20  MORY    */ 0,.  
12a20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20        /* WAL    
12a30 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b     */ 0.      };
12a40 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
12a50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72  ager;   /* Pager
12a60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12a70 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65   pBt */.      ne
12a80 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
12a90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12aa0 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20  eEnter(pBt);.   
12ab0 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
12ac0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
12ad0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  t);.      if( db
12ae0 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f  ->aDb[i].safety_
12af0 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e  level!=PAGER_SYN
12b00 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20  CHRONOUS_OFF.   
12b10 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64      && aMJNeeded
12b20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  [sqlite3PagerGet
12b30 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67  JournalMode(pPag
12b40 65 72 29 5d 0a 20 20 20 20 20 20 20 26 26 20 73  er)].       && s
12b50 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
12b60 64 62 28 70 50 61 67 65 72 29 3d 3d 30 0a 20 20  db(pPager)==0.  
12b70 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20      ){ .        
12b80 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a  assert( i!=1 );.
12b90 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b          nTrans++
12ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12bb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12bc0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
12bd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
12be0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12bf0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
12c00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
12c20 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
12c30 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
12c40 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12c50 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
12c60 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
12c70 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
12c80 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
12c90 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
12ca0 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
12cb0 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
12cc0 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
12cd0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12ce0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12cf0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
12d00 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
12d10 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
12d20 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
12d30 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
12d40 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
12d50 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
12d60 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
12d70 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
12d80 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
12d90 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
12da0 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
12db0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
12dc0 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
12dd0 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
12de0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
12df0 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
12e00 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
12e10 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
12e20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
12e30 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
12e40 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
12e50 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
12e60 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
12e70 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
12e80 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
12e90 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
12ea0 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
12eb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
12ec0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12ed0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
12ee0 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
12ef0 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
12f00 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
12f10 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
12f20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
12f30 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
12f40 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
12f50 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
12f60 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
12f70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12f80 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12f90 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
12fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12fb0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
12fc0 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
12fd0 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
12fe0 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
12ff0 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
13000 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
13010 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
13020 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
13030 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
13040 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
13050 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
13060 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
13070 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
13080 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
13090 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
130a0 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
130b0 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
130c0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
130d0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
130e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
130f0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
13100 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
13110 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
13120 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
13130 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
13140 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
13150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13160 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
13170 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
13180 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
131a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
131b0 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
131c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
131d0 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
131e0 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
131f0 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
13200 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
13210 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
13220 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
13230 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
13240 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
13250 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
13260 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
13270 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
13280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
13290 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
132a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
132b0 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
132c0 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
132d0 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
132e0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
132f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
13300 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
13310 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
13320 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
13330 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
13340 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
13350 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
13360 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
13370 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
13380 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
13390 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
133a0 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
133b0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
133c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
133d0 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
133e0 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
133f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
13400 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
13410 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
13420 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
13430 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
13440 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
13450 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
13460 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13470 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a  _BKPT;.    do {.
13480 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
13490 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
134a0 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
134b0 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
134c0 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
134d0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
134e0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
134f0 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
13500 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
13510 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
13520 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
13530 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
13540 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
13550 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
13560 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
13570 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
13580 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
13590 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
135a0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
135b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
135c0 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
135d0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
135e0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
135f0 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
13600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13610 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
13620 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
13630 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
13640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
13670 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
13680 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
13690 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
136a0 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
136b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
136c0 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
136d0 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
136e0 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
136f0 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
13700 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
13710 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13720 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
13730 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
13740 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
13750 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
13760 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
13770 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13790 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
137a0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
137b0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
137c0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
137d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
137e0 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
137f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13800 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
13810 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13820 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
13830 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
13840 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
13850 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
13860 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13870 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
13880 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13890 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
138a0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
138b0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
138c0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
138d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
138e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
138f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13900 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
13910 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
13920 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13930 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
13940 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
13950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13960 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
13970 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
13980 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
13990 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
139a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
139b0 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
139c0 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
139d0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
139e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
139f0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
13a00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
13a10 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
13a20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
13a30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13a40 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
13a50 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
13a60 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
13a70 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
13a80 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
13a90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13aa0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13ab0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
13ac0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
13ad0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13ae0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
13af0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
13b00 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
13b10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
13b20 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
13b30 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
13b40 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
13b50 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
13b60 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
13b70 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
13b80 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
13b90 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
13ba0 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
13bb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
13bc0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
13bd0 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
13be0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13bf0 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
13c00 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
13c10 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
13c20 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
13c30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13c50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13c60 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
13c70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13c80 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
13c90 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
13ca0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13cb0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13cc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
13cd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13ce0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13cf0 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
13d00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13d10 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
13d20 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
13d30 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
13d40 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
13d50 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
13d60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30      */.    if( 0
13d70 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
13d80 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
13d90 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
13da0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
13db0 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
13dc0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
13dd0 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
13de0 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
13df0 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
13e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
13e10 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
13e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13e30 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
13e40 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
13e50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13e60 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
13e70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13e80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
13e90 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
13ea0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
13eb0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
13ec0 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
13ed0 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
13ee0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13ef0 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
13f00 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
13f10 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
13f20 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
13f30 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
13f40 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
13f50 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
13f60 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
13f70 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
13f80 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
13f90 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
13fa0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13fb0 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
13fc0 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
13fd0 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
13fe0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13ff0 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
14000 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
14010 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
14020 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
14030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14040 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
14050 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
14060 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
14070 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
14080 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
14090 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
140a0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
140b0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
140c0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
140d0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
140e0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
140f0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
14100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
14110 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
14120 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
14130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14140 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14150 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
14160 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
14170 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
14180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
141a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
141b0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
141c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
141d0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
141e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
141f0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
14200 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
14210 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
14220 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
14230 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
14240 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
14250 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
14260 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
14270 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
14280 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
14290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
142a0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
142b0 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
142c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
142d0 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
142e0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
142f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14310 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
14320 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
14330 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
14340 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
14350 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
14360 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
14370 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
14380 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
14390 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
143a0 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
143b0 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
143c0 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
143d0 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
143e0 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
143f0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
14400 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
14410 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
14420 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
14430 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
14440 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
14450 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
14460 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
14470 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
14480 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
14490 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
144a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
144b0 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
144c0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
144d0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
144e0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
144f0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14500 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14520 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
14530 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
14540 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
14550 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
14560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
14570 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
14580 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
14590 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
145a0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
145b0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
145c0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
145d0 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
145e0 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
145f0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
14600 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
14610 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
14620 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
14630 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
14640 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
14650 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
14660 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
14670 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
14680 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
14690 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
146a0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
146b0 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
146c0 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
146d0 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
146e0 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
146f0 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
14700 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
14710 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
14720 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
14730 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
14740 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
14750 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
14760 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
14770 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
14780 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
14790 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
147a0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
147b0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
147c0 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
147d0 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
147e0 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
147f0 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
14800 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
14810 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
14820 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
14830 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
14840 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
14850 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
14860 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
14870 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
14880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
14890 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
148a0 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
148b0 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
148c0 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
148d0 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
148e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
148f0 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
14900 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
14910 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
14920 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
14930 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
14940 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
14950 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
14960 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
14970 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
14980 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
14990 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
149a0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
149b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
149c0 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
149d0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
149e0 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
149f0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
14a00 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
14a10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
14a20 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
14a30 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
14a40 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
14a50 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
14a60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
14a70 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
14a80 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
14a90 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
14aa0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
14ab0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14ac0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
14ad0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
14ae0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
14af0 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f  LINE int vdbeClo
14b00 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
14b10 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
14b20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
14b30 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
14b40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14b50 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
14b60 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
14b70 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
14b80 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t-1;..  assert( 
14b90 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
14ba0 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
14bb0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14bc0 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  E);.  assert( db
14bd0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
14be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
14bf0 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
14c00 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
14c10 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
14c20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14c30 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
14c40 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
14c50 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  _OK;.    Btree *
14c60 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
14c70 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
14c80 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t ){.      if( e
14c90 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
14ca0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
14cb0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
14cc0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
14cd0 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
14ce0 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
14cf0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14d00 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
14d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14d20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
14d30 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
14d40 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
14d50 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
14d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14d80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14d90 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
14da0 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53    }.  }.  db->nS
14db0 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d  tatement--;.  p-
14dc0 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
14dd0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14df0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
14e00 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
14e20 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
14e30 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14e40 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
14e50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
14e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14e70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e80 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
14e90 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
14ea0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
14eb0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
14ec0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
14ed0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
14ee0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
14ef0 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
14f00 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ore the .  ** da
14f10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
14f20 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
14f30 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
14f40 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
14f50 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74  hen .  ** the st
14f60 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14f70 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
14f80 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53   */.  if( eOp==S
14f90 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14fa0 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65  K ){.    db->nDe
14fb0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
14fc0 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
14fd0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
14fe0 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
14ff0 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d  tDefImmCons;.  }
15000 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15010 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
15020 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
15030 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
15040 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53  .  if( p->db->nS
15050 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
15060 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
15070 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73   return vdbeClos
15080 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f  eStatement(p, eO
15090 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
150a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
150b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
150c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
150d0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
150e0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
150f0 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
15100 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
15110 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
15120 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
15130 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
15140 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
15150 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
15160 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
15170 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
15180 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
15190 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
151a0 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
151b0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
151c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
151d0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
151e0 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
151f0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
15200 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
15210 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
15220 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
15230 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
15240 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
15250 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  EY.** and write 
15260 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
15270 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
15280 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15290 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
152a0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
152b0 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
152c0 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
152d0 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
152e0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
152f0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
15300 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64   (deferred && (d
15310 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
15320 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  +db->nDeferredIm
15330 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c  mCons)>0) .   ||
15340 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
15350 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
15360 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  0) .  ){.    p->
15370 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
15380 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
15390 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  Y;.    p->errorA
153a0 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
153b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
153c0 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49  eError(p, "FOREI
153d0 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
153e0 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
153f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15400 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
15410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
15420 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
15430 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
15440 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
15450 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
15460 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
15470 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
15480 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
15490 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
154a0 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
154b0 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
154c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
154d0 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
154e0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
154f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15500 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
15510 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
15520 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
15530 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
15540 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
15550 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
15560 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
15570 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
15580 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
15590 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
155a0 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
155b0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
155c0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
155d0 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
155e0 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
155f0 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
15600 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
15610 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
15620 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
15630 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
15640 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
15650 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
15660 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
15670 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
15680 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
15690 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
156c0 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
156d0 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
156e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
156f0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
15700 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
15710 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
15720 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
15730 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
15740 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
15750 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
15760 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
15770 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
15780 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
15790 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
157a0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
157b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
157c0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
157d0 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
157e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
157f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
15800 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
15810 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
15820 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
15830 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
15840 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
15850 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
15860 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
15870 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
15880 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
15890 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
158a0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
158b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
158c0 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
158d0 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
158e0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
158f0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
15900 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
15910 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
15920 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d    */..  if( p->m
15930 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
15940 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
15950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15960 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
15970 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
15980 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
15990 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
159a0 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
159b0 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  (p);.  checkActi
159c0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
159d0 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
159e0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
159f0 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
15a00 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
15a10 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
15a20 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
15a30 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
15a40 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
15a50 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
15a60 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
15a70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
15a80 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
15a90 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
15aa0 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
15ab0 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
15ac0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
15ad0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
15ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
15af0 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
15b00 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
15b10 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
15b20 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
15b30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
15b40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
15b50 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
15b60 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
15b70 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
15b80 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
15b90 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
15ba0 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
15bb0 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
15bc0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
15bd0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
15c00 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
15c10 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
15c20 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
15c30 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
15c40 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
15c50 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
15c60 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
15c70 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
15c80 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
15c90 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
15ca0 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
15cb0 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
15cc0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
15cd0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15ce0 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
15cf0 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
15d00 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
15d10 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
15d20 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
15d30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15d40 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
15d50 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
15d60 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
15d70 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
15d80 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
15d90 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
15da0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
15db0 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
15dc0 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
15dd0 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
15de0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
15df0 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
15e00 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
15e10 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
15e20 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
15e30 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
15e40 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
15e50 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
15e60 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
15e70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
15e80 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
15e90 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
15ea0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
15eb0 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
15ec0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
15ed0 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
15ee0 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
15ef0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
15f00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15f10 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
15f20 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
15f30 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
15f40 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
15f50 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
15f60 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
15f70 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
15f80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15f90 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
15fa0 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
15fb0 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
15fc0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
15fd0 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
15fe0 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
15ff0 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
16000 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
16010 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
16020 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
16030 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
16040 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
16050 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
16060 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
16070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
16080 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
16090 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
160a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
160b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
160c0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
160d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
160e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
160f0 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
16100 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
16110 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
16120 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
16130 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
16140 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
16150 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
16160 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  or) ){.      sql
16170 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
16180 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
16190 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
161a0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
161b0 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
161c0 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
161d0 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
161e0 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
161f0 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
16200 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
16210 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
16220 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
16230 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
16240 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
16250 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
16260 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
16270 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
16280 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
16290 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
162a0 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
162b0 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
162c0 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
162d0 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
162e0 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
162f0 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
16300 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
16310 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
16320 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
16330 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
16340 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
16350 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
16360 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
16370 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
16380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
163a0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
163b0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
163c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
163d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
163e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
163f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
16400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
16420 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
16430 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
16440 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
16450 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
16460 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
16470 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
16480 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
16490 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
164a0 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
164b0 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
164c0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
164d0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
164e0 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
164f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
16500 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
16510 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
16520 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
16530 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
16540 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
16550 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
16560 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
16570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
16590 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
165a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
165b0 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
165c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
165d0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
165e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
165f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
16610 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
16620 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
16630 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
16640 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  E_OK);.         
16650 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
16660 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16670 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
16680 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
16690 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
166a0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
166b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
166c0 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36  b->flags &= ~(u6
166d0 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  4)SQLITE_DeferFK
166e0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
166f0 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
16700 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
16710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
16730 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
16740 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
16750 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
16760 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
16770 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
16780 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
16790 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
167a0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
167b0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
167c0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
167d0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
167e0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
167f0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
16800 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
16810 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
16820 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
16830 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
16840 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
16850 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
16860 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
16870 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
16880 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16890 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
168a0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
168b0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
168c0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
168d0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
168e0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
168f0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
16900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16910 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
16920 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
16930 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
16940 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
16950 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
16960 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
16970 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
16980 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
16990 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
169a0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
169b0 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
169c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
169d0 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
169e0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
169f0 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
16a00 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
16a10 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
16a20 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
16a30 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
16a40 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
16a50 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
16a60 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
16a70 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
16a80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
16a90 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
16aa0 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
16ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
16ac0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
16ad0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
16ae0 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
16af0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
16b00 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
16b10 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
16b20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16b30 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
16b40 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
16b50 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
16b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16b70 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
16b80 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
16b90 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
16ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
16bb0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
16bc0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
16bd0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
16be0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
16bf0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
16c00 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
16c10 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
16c20 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
16c30 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
16c40 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
16c50 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
16c60 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
16c70 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
16c80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16c90 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
16ca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16cb0 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
16cc0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
16cd0 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
16ce0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
16cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16d00 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
16d10 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
16d20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
16d40 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
16d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16d60 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
16d70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
16d80 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
16d90 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
16da0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
16db0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
16dc0 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
16dd0 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
16de0 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
16df0 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
16e00 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
16e10 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
16e20 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
16e30 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
16e40 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
16e50 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
16e60 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  r ) db->nVdbeRea
16e70 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d--;.    assert(
16e80 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
16e90 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  >=db->nVdbeRead 
16ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
16eb0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62  b->nVdbeRead>=db
16ec0 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
16ed0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
16ee0 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b  nVdbeWrite>=0 );
16ef0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
16f00 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
16f10 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
16f20 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
16f30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
16f40 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
16f50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
16f60 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
16f70 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
16f80 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
16f90 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
16fa0 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
16fb0 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
16fc0 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
16fd0 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
16fe0 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
16ff0 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
17000 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
17010 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
17020 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
17030 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
17040 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
17050 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
17060 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
17070 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
17080 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
17090 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64  dbeActive>0 || d
170a0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
170b0 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
170c0 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
170d0 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
170e0 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
170f0 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
17100 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
17110 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
17120 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
17130 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
17140 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
17150 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
17160 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
17170 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
17180 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
17190 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
171a0 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
171b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
171c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
171d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
171e0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
171f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
17200 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
17210 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
17220 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
17230 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
17240 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
17250 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
17260 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
17270 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
17280 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
17290 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
172a0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
172b0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
172c0 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
172d0 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
172e0 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
172f0 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
17300 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17320 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
17330 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
17340 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
17350 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
17360 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
17370 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d  rrMsg ){.    db-
17380 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b  >bBenignMalloc++
17390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
173a0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
173b0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
173c0 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
173d0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
173e0 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
173f0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
17400 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
17410 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
17420 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
17430 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
17440 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
17450 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62  loc();.    db->b
17460 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a  BenignMalloc--;.
17470 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
17480 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pErr ){.    sqli
17490 74 65 33 56 61 6c 75 65 53 65 74 4e 75 6c 6c 28  te3ValueSetNull(
174a0 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20  db->pErr);.  }. 
174b0 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72   db->errCode = r
174c0 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
174d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
174e0 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
174f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54  *.** If an SQLIT
17500 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
17510 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72  hook is register
17520 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61  ed and the VM ha
17530 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20  s been run, .** 
17540 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74  invoke it..*/.st
17550 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
17560 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20  vokeSqllog(Vdbe 
17570 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *v){.  if( sqlit
17580 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
17590 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d  Sqllog && v->rc=
175a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d  =SQLITE_OK && v-
175b0 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d  >zSql && v->pc>=
175c0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
175d0 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74  Expanded = sqlit
175e0 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
175f0 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20  v, v->zSql);.   
17600 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e   assert( v->db->
17610 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
17620 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65      if( zExpande
17630 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
17640 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
17650 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20  Sqllog(.        
17660 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
17670 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
17680 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  , v->db, zExpand
17690 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20  ed, 1.      );. 
176a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
176b0 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  ee(v->db, zExpan
176c0 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ded);.    }.  }.
176d0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
176e0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
176f0 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g(x).#endif../*.
17700 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
17710 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
17720 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
17730 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
17740 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
17750 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
17760 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
17770 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
17780 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
17790 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
177a0 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
177b0 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
177c0 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
177d0 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
177e0 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
177f0 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
17800 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
17810 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
17820 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
17830 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
17840 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
17850 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
17860 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
17870 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
17880 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
17890 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  set(Vdbe *p){.#i
178a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
178b0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
178c0 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
178d0 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
178e0 0a 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ..  sqlite3 *db;
178f0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
17900 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
17910 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
17920 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
17930 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
17940 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
17950 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
17960 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
17970 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
17980 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
17990 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
179a0 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a  beHalt(p);..  /*
179b0 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
179c0 20 62 65 65 6e 20 72 75 6e 20 65 76 65 6e 20 70   been run even p
179d0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
179e0 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
179f0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
17a00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
17a10 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
17a20 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
17a30 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
17a40 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
17a50 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
17a60 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
17a70 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
17a80 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
17a90 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
17aa0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
17ab0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
17ac0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
17ad0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
17ae0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
17af0 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
17b00 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
17b10 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
17b20 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
17b30 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
17b40 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
17b50 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
17b60 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
17b70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
17b80 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
17b90 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
17ba0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
17bb0 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
17bc0 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
17bd0 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
17be0 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
17bf0 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
17c00 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
17c10 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
17c20 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
17c30 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
17c40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
17c50 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d  orWithMsg(db, p-
17c60 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20  >rc, p->zErrMsg 
17c70 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a  ? "%s" : 0, p->z
17c80 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20  ErrMsg);.  }..  
17c90 2f 2a 20 52 65 73 65 74 20 72 65 67 69 73 74 65  /* Reset registe
17ca0 72 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 72  r contents and r
17cb0 65 63 6c 61 69 6d 20 65 72 72 6f 72 20 6d 65 73  eclaim error mes
17cc0 73 61 67 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 2a  sage memory..  *
17cd0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17ce0 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
17cf0 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
17d00 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
17d10 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
17d20 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
17d30 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
17d40 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
17d50 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
17d60 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61  .  */.  if( p->a
17d70 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
17d80 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
17d90 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
17da0 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
17db0 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
17dc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
17dd0 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
17de0 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
17df0 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
17e00 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
17e10 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17e20 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
17e30 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
17e40 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
17e50 53 65 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  Set = 0;.#ifdef 
17e60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
17e70 2d 3e 6e 57 72 69 74 65 20 3d 20 30 3b 0a 23 65  ->nWrite = 0;.#e
17e80 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 61 76 65 20  ndif..  /* Save 
17e90 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
17ea0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
17eb0 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
17ec0 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
17ed0 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
17ee0 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
17ef0 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
17f00 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
17f10 75 74 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ut ){.      fpri
17f20 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
17f30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
17f40 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
17f50 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
17f60 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
17f70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
17f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f90 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
17fa0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
17fb0 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
17fc0 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
17fd0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
17fe0 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
17ff0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
18000 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
18010 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
18020 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
18030 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
18040 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
18050 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
18060 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
18070 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18080 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
18090 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
180a0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
180b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
180c0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
180d0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
180e0 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
180f0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
18100 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
18110 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
18120 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
18130 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
18140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
18150 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
18160 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
18170 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
18180 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
18190 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
181a0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
181b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
181c0 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
181d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
181e0 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
181f0 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
18200 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
18210 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
18220 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
18230 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
18240 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20  RESET;.  return 
18250 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
18260 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
18270 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
18280 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
18290 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
182a0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
182b0 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
182c0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
182d0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
182e0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
182f0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
18300 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
18310 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
18320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18330 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
18340 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
18350 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
18360 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
18370 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18380 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
18390 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
183a0 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
183b0 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
183c0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
183d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
183e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
183f0 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
18400 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
18410 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
18420 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
18430 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
18440 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
18450 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
18460 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
18470 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
18480 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
18490 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
184a0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
184b0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
184c0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
184d0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
184e0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
184f0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
18500 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
18510 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
18520 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
18530 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
18540 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
18550 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
18560 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
18570 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
18580 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
18590 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
185a0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
185b0 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
185c0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
185d0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
185e0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
185f0 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
18600 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
18610 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
18620 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
18630 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
18640 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
18650 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
18660 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
18670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18680 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73  eDeleteAuxData(s
18690 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44  qlite3 *db, AuxD
186a0 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f  ata **pp, int iO
186b0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
186c0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
186d0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
186e0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
186f0 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
18700 70 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f  pAux->iAuxOp==iO
18710 70 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  p.          && p
18720 41 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a  Aux->iAuxArg>=0.
18730 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 41            && (pA
18740 75 78 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c  ux->iAuxArg>31 |
18750 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
18760 49 54 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41  IT32(pAux->iAuxA
18770 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
18780 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
18790 75 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20  ux->iAuxArg==31 
187a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  );.      if( pAu
187b0 78 2d 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b  x->xDeleteAux ){
187c0 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
187d0 44 65 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e  DeleteAux(pAux->
187e0 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
187f0 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
18800 3e 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20  >pNextAux;.     
18810 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18820 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65  b, pAux);.    }e
18830 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26  lse{.      pp= &
18840 70 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a  pAux->pNextAux;.
18850 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18860 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
18870 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
18880 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
18890 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
188a0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
188b0 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
188c0 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
188d0 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
188e0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
188f0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
18900 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
18910 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
18920 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
18930 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
18940 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
18950 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
18960 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
18970 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
18980 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
18990 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
189a0 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
189b0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
189c0 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
189d0 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
189e0 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
189f0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  ub, *pNext;.  as
18a00 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
18a10 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
18a20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
18a30 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
18a40 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
18a50 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
18a60 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
18a70 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
18a80 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
18a90 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
18aa0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
18ab0 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
18ac0 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
18ad0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18ae0 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66   pSub);.  }.  if
18af0 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
18b00 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
18b10 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
18b20 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
18b30 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Var);.    sqlite
18b40 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
18b50 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  VList);.    sqli
18b60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
18b70 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76  >pFree);.  }.  v
18b80 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
18b90 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
18ba0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
18bb0 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
18bc0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
18bd0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
18be0 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
18bf0 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
18c00 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  ZE.  sqlite3DbFr
18c10 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 6f 72 6d 53  ee(db, p->zNormS
18c20 71 6c 29 3b 0a 20 20 7b 0a 20 20 20 20 44 62 6c  ql);.  {.    Dbl
18c30 71 75 6f 74 65 53 74 72 20 2a 70 54 68 69 73 2c  quoteStr *pThis,
18c40 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72   *pNext;.    for
18c50 28 70 54 68 69 73 3d 70 2d 3e 70 44 62 6c 53 74  (pThis=p->pDblSt
18c60 72 3b 20 70 54 68 69 73 3b 20 70 54 68 69 73 3d  r; pThis; pThis=
18c70 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
18c80 65 78 74 20 3d 20 70 54 68 69 73 2d 3e 70 4e 65  ext = pThis->pNe
18c90 78 74 53 74 72 3b 0a 20 20 20 20 20 20 73 71 6c  xtStr;.      sql
18ca0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
18cb0 54 68 69 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  This);.    }.  }
18cc0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
18cd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
18ce0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b  T_SCANSTATUS.  {
18cf0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18d00 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
18d10 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  can; i++){.     
18d20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18d30 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a  b, p->aScan[i].z
18d40 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
18d50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18d60 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20  b, p->aScan);.  
18d70 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
18d80 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
18d90 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
18da0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
18db0 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
18dc0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61  qlite3 *db;..  a
18dd0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
18de0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
18df0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18e00 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
18e10 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
18e20 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
18e30 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
18e40 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
18e50 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
18e60 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
18e70 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
18e80 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
18e90 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
18ea0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
18eb0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
18ec0 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
18ed0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
18ee0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
18ef0 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
18f00 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
18f10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
18f20 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
18f30 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22  * The cursor "p"
18f40 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73   has a pending s
18f50 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68  eek operation th
18f60 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  at has not yet b
18f70 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f  een.** carried o
18f80 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75  ut.  Seek the cu
18f90 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e  rsor now.  If an
18fa0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
18fb0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70  eturn.** the app
18fc0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
18fd0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
18fe0 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
18ff0 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65  NE handleDeferre
19000 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  dMoveto(VdbeCurs
19010 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65  or *p){.  int re
19020 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  s, rc;.#ifdef SQ
19030 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65  LITE_TEST.  exte
19040 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
19050 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
19060 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d  dif.  assert( p-
19070 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
19080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
19090 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  isTable );.  ass
190a0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
190b0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
190c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
190d0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
190e0 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  cked(p->uc.pCurs
190f0 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f  or, 0, p->moveto
19100 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29  Target, 0, &res)
19110 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19120 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65  urn rc;.  if( re
19130 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s!=0 ) return SQ
19140 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19150 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  T;.#ifdef SQLITE
19160 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
19170 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
19180 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65  #endif.  p->defe
19190 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
191a0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
191b0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
191c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
191d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  OK;.}../*.** Som
191e0 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64  ething has moved
191f0 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20   cursor "p" out 
19200 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65  of place.  Maybe
19210 20 74 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a   the row it was.
19220 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61  ** pointed to wa
19230 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
19240 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72  om under it.  Or
19250 20 6d 61 79 62 65 20 74 68 65 20 62 74 72 65 65   maybe the btree
19260 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63   was.** rebalanc
19270 65 64 2e 20 20 57 68 61 74 65 76 65 72 20 74 68  ed.  Whatever th
19280 65 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20  e cause, try to 
19290 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74  restore "p" to t
192a0 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69  he place it.** i
192b0 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65  s supposed to be
192c0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74   pointing.  If t
192d0 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74  he row was delet
192e0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
192f0 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c  r the.** cursor,
19300 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20   set the cursor 
19310 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55  to point to a NU
19320 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  LL row..*/.stati
19330 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
19340 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65  NLINE handleMove
19350 64 43 75 72 73 6f 72 28 56 64 62 65 43 75 72 73  dCursor(VdbeCurs
19360 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73  or *p){.  int is
19370 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63  DifferentRow, rc
19380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
19390 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
193a0 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65  _BTREE );.  asse
193b0 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f  rt( p->uc.pCurso
193c0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
193d0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
193e0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
193f0 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  uc.pCursor) );. 
19400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
19410 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
19420 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  p->uc.pCursor, &
19430 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b  isDifferentRow);
19440 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75  .  p->cacheStatu
19450 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
19460 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65  .  if( isDiffere
19470 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52  ntRow ) p->nullR
19480 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ow = 1;.  return
19490 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
194a0 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68  eck to ensure th
194b0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
194c0 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65   valid.  Restore
194d0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   the cursor.** i
194e0 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75  f need be.  Retu
194f0 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72  rn any I/O error
19500 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72   from the restor
19510 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
19520 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
19530 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62  ursorRestore(Vdb
19540 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61  eCursor *p){.  a
19550 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
19560 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
19570 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  E );.  if( sqlit
19580 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
19590 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
195a0 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  sor) ){.    retu
195b0 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
195c0 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rsor(p);.  }.  r
195d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
195e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
195f0 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
19600 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
19610 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
19620 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
19630 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
19640 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
19650 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
19660 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
19670 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
19680 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
19690 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
196a0 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
196b0 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
196c0 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
196d0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
196e0 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
196f0 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
19700 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
19710 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
19720 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
19730 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
19740 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
19750 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
19760 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
19770 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
19780 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
19790 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
197a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
197b0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
197c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
197d0 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
197e0 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
197f0 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
19800 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
19810 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
19820 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
19830 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
19840 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
19850 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
19860 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a  rsor **pp, int *
19870 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75  piCol){.  VdbeCu
19880 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  rsor *p = *pp;. 
19890 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
198a0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
198b0 52 45 45 20 7c 7c 20 70 2d 3e 65 43 75 72 54 79  REE || p->eCurTy
198c0 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55  pe==CURTYPE_PSEU
198d0 44 4f 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  DO );.  if( p->d
198e0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
198f0 0a 20 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20  .    int iMap;. 
19900 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61     if( p->aAltMa
19910 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e  p && (iMap = p->
19920 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c  aAltMap[1+*piCol
19930 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  ])>0 ){.      *p
19940 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f  p = p->pAltCurso
19950 72 3b 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  r;.      *piCol 
19960 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20  = iMap - 1;.    
19970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19980 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
19990 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72  turn handleDefer
199a0 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20  redMoveto(p);.  
199b0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  }.  if( sqlite3B
199c0 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
199d0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
199e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
199f0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
19a00 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
19a10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19a20 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
19a30 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
19a40 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
19a50 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
19a60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19a70 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
19a80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19a90 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
19aa0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
19ab0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
19ac0 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
19ad0 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
19ae0 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
19af0 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
19b00 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
19b10 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
19b20 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
19b30 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
19b40 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
19b50 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
19b60 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
19b70 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
19b80 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
19b90 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
19ba0 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
19bb0 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
19bc0 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
19bd0 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
19be0 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
19bf0 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
19c00 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
19c10 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
19c20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
19c30 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
19c40 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
19c50 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
19c60 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
19c70 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
19c80 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
19c90 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
19ca0 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
19cb0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
19cc0 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
19cd0 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
19ce0 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
19cf0 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65  ta blob separate
19d00 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
19d10 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
19d20 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
19d30 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
19d40 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
19d50 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
19d60 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
19d70 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
19d80 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
19d90 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
19da0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
19db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
19dc0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
19dd0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
19de0 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
19df0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
19e00 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
19e10 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
19e20 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
19e50 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
19e60 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
19e80 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
19e90 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
19ea0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
19eb0 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
19ec0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19ed0 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
19f00 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19f10 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
19f20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
19f30 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19f40 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
19f50 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
19f60 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
19f70 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
19f80 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
19f90 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
19fa0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
19fb0 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
19fc0 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
19fd0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
19fe0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
19ff0 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
1a000 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
1a030 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
1a040 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
1a050 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
1a060 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
1a070 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
1a080 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
1a090 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
1a0a0 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
1a0b0 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
1a0c0 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
1a0d0 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
1a0e0 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
1a0f0 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
1a100 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
1a110 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
1a120 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a130 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
1a140 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
1a150 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a  ed in pMem..**.*
1a160 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
1a170 69 67 68 74 20 63 6f 6e 76 65 72 74 20 61 20 6c  ight convert a l
1a180 61 72 67 65 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  arge MEM_IntReal
1a190 20 76 61 6c 75 65 20 69 6e 74 6f 20 4d 45 4d 5f   value into MEM_
1a1a0 52 65 61 6c 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  Real..*/.u32 sql
1a1b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1a1c0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
1a1d0 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75  t file_format, u
1a1e0 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74  32 *pLen){.  int
1a1f0 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
1a200 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  lags;.  u32 n;..
1a210 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d    assert( pLen!=
1a220 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  0 );.  if( flags
1a230 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1a240 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
1a250 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1a260 69 66 28 20 66 6c 61 67 73 26 28 4d 45 4d 5f 49  if( flags&(MEM_I
1a270 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20  nt|MEM_IntReal) 
1a280 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
1a290 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
1a2a0 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
1a2b0 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
1a2c0 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
1a2d0 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
1a2e0 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
1a2f0 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
1a300 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
1a310 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1a320 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1a330 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1a340 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52  flags & MEM_IntR
1a350 65 61 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 69  eal );.    if( i
1a360 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
1a370 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
1a380 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
1a390 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
1a3a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
1a3b0 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
1a3c0 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
1a3d0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
1a3e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
1a3f0 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
1a400 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
1a410 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1a420 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1a430 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1a440 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
1a450 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
1a460 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
1a470 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
1a480 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
1a490 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
1a4a0 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
1a4b0 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
1a4c0 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
1a4d0 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
1a4e0 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
1a4f0 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
1a500 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
1a510 49 6e 74 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  IntReal ){.     
1a520 20 2f 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65   /* If the value
1a530 20 69 73 20 49 6e 74 52 65 61 6c 20 61 6e 64 20   is IntReal and 
1a540 69 73 20 67 6f 69 6e 67 20 74 6f 20 74 61 6b 65  is going to take
1a550 20 75 70 20 38 20 62 79 74 65 73 20 74 6f 20 73   up 8 bytes to s
1a560 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  tore.      ** as
1a570 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
1a580 6e 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65  n we might as we
1a590 6c 6c 20 6d 61 6b 65 20 69 74 20 61 6e 20 38 2d  ll make it an 8-
1a5a0 62 79 74 65 20 66 6c 6f 61 74 69 6e 67 0a 20 20  byte floating.  
1a5b0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 76 61 6c      ** point val
1a5c0 75 65 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  ue */.      pMem
1a5d0 2d 3e 75 2e 72 20 3d 20 28 64 6f 75 62 6c 65 29  ->u.r = (double)
1a5e0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pMem->u.i;.     
1a5f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20   pMem->flags &= 
1a600 7e 4d 45 4d 5f 49 6e 74 52 65 61 6c 3b 0a 20 20  ~MEM_IntReal;.  
1a610 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a620 7c 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20  |= MEM_Real;.   
1a630 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 20     return 7;.   
1a640 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b   }.    return 6;
1a650 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
1a660 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
1a670 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20   *pLen = 8;.    
1a680 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
1a690 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
1a6a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1a6b0 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
1a6c0 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
1a6d0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
1a6e0 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
1a6f0 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
1a700 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1a710 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
1a720 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
1a730 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72    *pLen = n;.  r
1a740 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
1a750 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
1a760 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
1a770 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f  .** The sizes fo
1a780 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c  r serial types l
1a790 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a  ess than 128.*/.
1a7a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1a7b0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1a7c0 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Sizes[] = {.    
1a7d0 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20      /*  0   1   
1a7e0 32 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20  2   3   4   5   
1a7f0 36 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f  6   7   8   9 */
1a800 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20     ./*   0 */   
1a810 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20  0,  1,  2,  3,  
1a820 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20  4,  6,  8,  8,  
1a830 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f  0,  0,./*  10 */
1a840 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
1a850 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32  ,  1,  1,  2,  2
1a860 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30  ,  3,  3,./*  20
1a870 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c   */   4,  4,  5,
1a880 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c    5,  6,  6,  7,
1a890 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20    7,  8,  8,./* 
1a8a0 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20   30 */   9,  9, 
1a8b0 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20  10, 10, 11, 11, 
1a8c0 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a  12, 12, 13, 13,.
1a8d0 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31  /*  40 */  14, 1
1a8e0 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31  4, 15, 15, 16, 1
1a8f0 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31  6, 17, 17, 18, 1
1a900 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39  8,./*  50 */  19
1a910 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31  , 19, 20, 20, 21
1a920 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33  , 21, 22, 22, 23
1a930 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20  , 23,./*  60 */ 
1a940 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c   24, 24, 25, 25,
1a950 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c   26, 26, 27, 27,
1a960 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20   28, 28,./*  70 
1a970 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20  */  29, 29, 30, 
1a980 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20  30, 31, 31, 32, 
1a990 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20  32, 33, 33,./*  
1a9a0 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33  80 */  34, 34, 3
1a9b0 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33  5, 35, 36, 36, 3
1a9c0 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f  7, 37, 38, 38,./
1a9d0 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39  *  90 */  39, 39
1a9e0 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31  , 40, 40, 41, 41
1a9f0 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33  , 42, 42, 43, 43
1aa00 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c  ,./* 100 */  44,
1aa10 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c   44, 45, 45, 46,
1aa20 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c   46, 47, 47, 48,
1aa30 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20   48,./* 110 */  
1aa40 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20  49, 49, 50, 50, 
1aa50 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20  51, 51, 52, 52, 
1aa60 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a  53, 53,./* 120 *
1aa70 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35  /  54, 54, 55, 5
1aa80 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35  5, 56, 56, 57, 5
1aa90 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  7.};../*.** Retu
1aaa0 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
1aab0 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
1aac0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
1aad0 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
1aae0 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
1aaf0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1ab00 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
1ab10 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
1ab20 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b  ial_type>=128 ){
1ab30 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
1ab40 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1ab50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1ab60 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
1ab70 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20  <12 .           
1ab80 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   || sqlite3Small
1ab90 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
1aba0 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f  _type]==(serial_
1abb0 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a  type - 12)/2 );.
1abc0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1abd0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1abe0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
1abf0 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56   }.}.u8 sqlite3V
1ac00 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c  dbeOneByteSerial
1ac10 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61  TypeLen(u8 seria
1ac20 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72  l_type){.  asser
1ac30 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  t( serial_type<1
1ac40 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  28 );.  return s
1ac50 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
1ac60 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
1ac70 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ];  .}../*.** If
1ac80 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
1ac90 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
1aca0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
1acb0 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
1acc0 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
1acd0 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
1ace0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
1acf0 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
1ad00 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
1ad10 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
1ad20 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
1ad30 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
1ad40 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
1ad50 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
1ad60 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
1ad70 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
1ad80 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
1ad90 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
1ada0 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
1adb0 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
1adc0 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
1add0 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
1ade0 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
1adf0 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
1ae00 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
1ae10 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
1ae20 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
1ae30 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
1ae40 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
1ae50 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
1ae60 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
1ae70 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
1ae80 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
1ae90 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
1aea0 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
1aeb0 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
1aec0 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
1aed0 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
1aee0 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
1aef0 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
1af00 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
1af10 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
1af20 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
1af30 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
1af40 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
1af50 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
1af60 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
1af70 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
1af80 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
1af90 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
1afa0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
1afb0 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
1afc0 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
1afd0 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
1afe0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
1aff0 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
1b000 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
1b010 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
1b020 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
1b030 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
1b040 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
1b050 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
1b060 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
1b070 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
1b080 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
1b090 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
1b0a0 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
1b0b0 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
1b0c0 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
1b0d0 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
1b0e0 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
1b0f0 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
1b100 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
1b110 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
1b120 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
1b130 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1b140 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
1b150 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
1b160 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
1b170 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
1b180 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
1b190 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
1b1a0 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
1b1b0 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
1b1c0 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
1b1d0 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
1b1e0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
1b1f0 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
1b200 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
1b210 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
1b220 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
1b230 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
1b240 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
1b250 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
1b260 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
1b270 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
1b280 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
1b290 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
1b2a0 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
1b2b0 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
1b2c0 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
1b2d0 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
1b2e0 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
1b2f0 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
1b300 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1b310 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
1b320 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
1b330 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
1b340 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
1b350 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
1b360 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
1b370 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
1b380 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
1b390 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
1b3a0 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
1b3b0 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
1b3c0 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
1b3d0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
1b3e0 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
1b3f0 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
1b400 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
1b410 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
1b420 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
1b430 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
1b440 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
1b450 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
1b460 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
1b470 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
1b480 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1b490 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
1b4a0 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
1b4b0 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
1b4c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1b4d0 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
1b4e0 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
1b4f0 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
1b500 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
1b510 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
1b520 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72  sponsible.** for
1b530 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75   allocating enou
1b540 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b  gh space to buf[
1b550 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  ] to hold the en
1b560 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c  tire field, excl
1b570 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20  usive.** of the 
1b580 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79  pMem->u.nZero by
1b590 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65  tes for a MEM_Ze
1b5a0 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
1b5b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1b5c0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
1b5d0 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lly written into
1b5e0 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d   buf[].  The num
1b5f0 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  ber.** of bytes 
1b600 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  in the zero-fill
1b610 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75  ed tail is inclu
1b620 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72  ded in the retur
1b630 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20  n value only.** 
1b640 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77  if those bytes w
1b650 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75  ere zeroed in bu
1b660 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c  f[]..*/ .u32 sql
1b670 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
1b680 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a  t(u8 *buf, Mem *
1b690 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c  pMem, u32 serial
1b6a0 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65  _type){.  u32 le
1b6b0 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
1b6c0 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
1b6d0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
1b6e0 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
1b6f0 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
1b700 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20  .    u32 i;.    
1b710 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1b720 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
1b730 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
1b740 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
1b750 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1b760 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c  (&v, &pMem->u.r,
1b770 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
1b780 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
1b790 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
1b7a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
1b7b0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
1b7c0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
1b7d0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1b7e0 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
1b7f0 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e];.    assert( 
1b800 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  i>0 );.    do{. 
1b810 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20       buf[--i] = 
1b820 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
1b830 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
1b840 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20   }while( i );.  
1b850 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
1b860 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
1b870 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
1b880 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
1b890 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b8a0 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
1b8b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1b8c0 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
1b8d0 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
1b8e0 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
1b8f0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1b900 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
1b910 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
1b920 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  ->n;.    if( len
1b930 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c  >0 ) memcpy(buf,
1b940 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
1b950 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
1b960 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
1b970 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
1b980 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
1b990 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
1b9a0 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
1b9b0 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
1b9c0 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
1b9d0 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
1b9e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
1b9f0 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
1ba00 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
1ba10 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
1ba20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
1ba30 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
1ba40 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
1ba50 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
1ba60 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
1ba70 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
1ba80 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
1ba90 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
1baa0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
1bab0 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
1bac0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
1bad0 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
1bae0 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
1baf0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
1bb00 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[3]).#define F
1bb10 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  OUR_BYTE_INT(x) 
1bb20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28  (16777216*(i8)((
1bb30 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
1bb40 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
1bb50 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44  (x)[3])../*.** D
1bb60 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
1bb70 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
1bb80 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
1bb90 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
1bba0 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
1bbb0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
1bbc0 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
1bbd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1bbe0 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  es read..**.** T
1bbf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bc00 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74  implemented as t
1bc10 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74  wo separate rout
1bc20 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d  ines for perform
1bc30 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77  ance..** The few
1bc40 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75   cases that requ
1bc50 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  ire local variab
1bc60 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f  les are broken o
1bc70 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  ut into a separa
1bc80 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  te.** routine so
1bc90 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61   that in most ca
1bca0 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64  ses the overhead
1bcb0 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73   of moving the s
1bcc0 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  tack pointer.** 
1bcd0 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a  is avoided..*/ .
1bce0 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54  static u32 SQLIT
1bcf0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61  E_NOINLINE seria
1bd00 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
1bd10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
1bd20 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
1bd30 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
1bd40 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
1bd50 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
1bd60 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1bd70 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
1bd80 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
1bd90 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
1bda0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
1bdb0 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
1bdc0 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
1bdd0 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f  .  u64 x = FOUR_
1bde0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a  BYTE_UINT(buf);.
1bdf0 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42    u32 y = FOUR_B
1be00 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b  YTE_UINT(buf+4);
1be10 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b  .  x = (x<<32) +
1be20 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c   y;.  if( serial
1be30 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
1be40 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1be50 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61  R-29851-52272 Va
1be60 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1be70 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  ian 64-bit.    *
1be80 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1be90 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1bea0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
1beb0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65  i64*)&x;.    pMe
1bec0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1bed0 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  nt;.    testcase
1bee0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1bef0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1bf00 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1bf10 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75  57343-49114 Valu
1bf20 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1bf30 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
1bf40 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c  64-bit.    ** fl
1bf50 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
1bf60 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66  ber. */.#if !def
1bf70 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
1bf80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1bf90 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1bfa0 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69  INT).    /* Veri
1bfb0 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
1bfc0 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
1bfd0 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
1bfe0 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62  he same.    ** b
1bff0 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
1c000 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
1c010 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
1c020 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a  T_FLOAT is.    *
1c030 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
1c040 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
1c050 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
1c060 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
1c070 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
1c080 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1c090 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
1c0a0 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
1c0b0 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  32;.    static c
1c0c0 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
1c0d0 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32   1.0;.    u64 t2
1c0e0 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d   = t1;.    swapM
1c0f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1c100 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t2);.    assert(
1c110 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
1c120 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
1c130 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
1c140 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
1c150 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
1c160 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
1c170 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e   sizeof(pMem->u.
1c180 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61  r)==8 );.    swa
1c190 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
1c1a0 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  t(x);.    memcpy
1c1b0 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c  (&pMem->u.r, &x,
1c1c0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
1c1d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
1c1e0 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
1c1f0 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  ->u.r) ? MEM_Nul
1c200 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
1c210 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a  }.  return 8;.}.
1c220 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
1c230 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
1c240 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c250 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
1c260 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
1c270 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
1c280 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
1c290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1c2a0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
1c2b0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
1c2c0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1c2e0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
1c2f0 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
1c300 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
1c310 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1c320 20 20 63 61 73 65 20 31 30 3a 20 7b 20 2f 2a 20    case 10: { /* 
1c330 49 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e 6c  Internal use onl
1c340 79 3a 20 4e 55 4c 4c 20 77 69 74 68 20 76 69 72  y: NULL with vir
1c350 74 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20  tual table.     
1c360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 50 44            ** UPD
1c370 41 54 45 20 6e 6f 2d 63 68 61 6e 67 65 20 66 6c  ATE no-change fl
1c380 61 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  ag set */.      
1c390 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1c3a0 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b  M_Null|MEM_Zero;
1c3b0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
1c3c0 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   0;.      pMem->
1c3d0 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 20  u.nZero = 0;.   
1c3e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c3f0 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
1c400 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
1c410 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
1c420 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
1c430 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
1c440 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1c450 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
1c460 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
1c470 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1c480 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
1c490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c4a0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
1c4b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c4c0 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
1c4d0 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
1c4e0 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
1c4f0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
1c500 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1c510 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
1c520 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1c530 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c540 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1c550 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1c560 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1c570 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c580 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1c590 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1c5a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1c5b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c5c0 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
1c5d0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1c5e0 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
1c5f0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1c600 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1c610 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1c620 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
1c630 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1c640 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1c650 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c660 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1c670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
1c680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c690 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1c6a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1c6b0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1c6c0 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
1c6d0 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
1c6e0 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
1c6f0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1c700 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1c710 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1c720 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
1c730 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1c740 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1c750 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1c760 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1c770 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1c780 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
1c790 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1c7a0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1c7b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1c7c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c7d0 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
1c7e0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
1c7f0 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
1c800 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
1c810 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
1c820 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1c830 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
1c840 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
1c850 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
1c860 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
1c870 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
1c880 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
1c890 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
1c8a0 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
1c8b0 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
1c8c0 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
1c8d0 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
1c8e0 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
1c8f0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1c900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c910 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
1c920 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
1c930 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1c940 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1c950 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c960 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c970 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
1c980 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1c990 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
1c9a0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1c9b0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1c9c0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1c9d0 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1c9e0 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
1c9f0 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1ca00 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1ca10 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1ca20 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1ca30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1ca40 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1ca50 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
1ca60 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
1ca70 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1ca80 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1ca90 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
1caa0 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
1cab0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
1cac0 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
1cad0 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
1cae0 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
1caf0 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
1cb00 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
1cb10 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
1cb20 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
1cb30 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
1cb40 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
1cb50 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
1cb60 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
1cb70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
1cb80 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
1cb90 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
1cba0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
1cbb0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1cbc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
1cbd0 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
1cbe0 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
1cbf0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1cc00 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
1cc10 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
1cc20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
1cc30 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1cc40 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
1cc50 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
1cc60 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1cc70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1cc80 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1cc90 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
1cca0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
1ccb0 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
1ccc0 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
1ccd0 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
1cce0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
1ccf0 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
1cd00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
1cd10 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
1cd20 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
1cd30 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
1cd40 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
1cd50 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
1cd60 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
1cd70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
1cd80 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
1cd90 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
1cda0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
1cdb0 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
1cdc0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
1cdd0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1cde0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1cdf0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
1ce00 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
1ce10 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
1ce20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
1ce30 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
1ce40 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
1ce50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ce60 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1ce70 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
1ce80 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
1ce90 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
1cea0 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
1ceb0 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
1cec0 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
1ced0 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
1cee0 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
1cef0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1cf00 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
1cf10 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
1cf20 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
1cf30 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
1cf40 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
1cf50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1cf60 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
1cf70 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
1cf80 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
1cf90 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
1cfa0 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
1cfb0 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
1cfc0 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
1cfd0 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
1cfe0 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
1cff0 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1d000 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1d010 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1d020 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1d030 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1d040 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1d050 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1d060 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1d070 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1d080 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1d090 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1d0a0 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1d0b0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1d0c0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1d0d0 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1d0e0 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1d0f0 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1d100 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1d110 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1d120 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1d130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1d140 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1d150 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
1d160 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d170 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1d180 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
1d190 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
1d1a0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1d1d0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
1d1e0 72 20 2a 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20  r *p */.  nByte 
1d1f0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1d200 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1d210 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
1d220 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
1d230 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55  eld+1);.  p = (U
1d240 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
1d250 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1d260 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
1d270 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 21   nByte);.  if( !
1d280 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1d290 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1d2a0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1d2b0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1d2c0 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1d2d0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1d2e0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1d2f0 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1d300 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1d310 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1d320 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20  fo->nKeyField + 
1d330 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1d340 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1d350 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1d360 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1d370 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1d380 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1d390 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1d3a0 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1d3b0 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1d3c0 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1d3d0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1d3e0 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1d3f0 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1d400 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1d410 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1d420 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1d430 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1d440 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1d450 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1d460 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1d470 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1d480 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1d490 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1d4a0 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1d4b0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1d4c0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1d4d0 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1d4e0 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1d4f0 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1d500 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1d510 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1d520 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1d530 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1d540 20 2a 29 70 4b 65 79 3b 0a 20 20 75 33 32 20 64   *)pKey;.  u32 d
1d550 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1d580 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1d590 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1d5a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1d5c0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1d5d0 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1d5e0 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1d5f0 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1d600 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1d610 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1d620 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1d630 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1d640 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1d650 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1d660 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1d670 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1d680 48 64 72 20 26 26 20 64 3c 3d 28 75 33 32 29 6e  Hdr && d<=(u32)n
1d690 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73  Key ){.    u32 s
1d6a0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1d6b0 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1d6c0 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20  t32(&aKey[idx], 
1d6d0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1d6e0 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
1d6f0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1d700 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
1d710 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a  Info->db;.    /*
1d720 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
1d730 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65  ; // sqlite3Vdbe
1d740 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c  SerialGet() will
1d750 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73   set this for us
1d760 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a   */.    pMem->sz
1d770 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
1d780 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20  pMem->z = 0;.   
1d790 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
1d7a0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1d7b0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
1d7c0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
1d7d0 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
1d7e0 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
1d7f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1d800 20 64 3e 28 75 33 32 29 6e 4b 65 79 20 26 26 20   d>(u32)nKey && 
1d810 75 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  u ){.    assert(
1d820 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1d830 20 20 20 2f 2a 20 49 6e 20 61 20 63 6f 72 72 75     /* In a corru
1d840 70 74 20 72 65 63 6f 72 64 20 65 6e 74 72 79 2c  pt record entry,
1d850 20 74 68 65 20 6c 61 73 74 20 70 4d 65 6d 20 6d   the last pMem m
1d860 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73  ight have been s
1d870 65 74 20 75 70 20 75 73 69 6e 67 20 0a 20 20 20  et up using .   
1d880 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
1d890 64 20 6d 65 6d 6f 72 79 2e 20 4f 76 65 72 77 72  d memory. Overwr
1d8a0 69 74 65 20 69 74 73 20 76 61 6c 75 65 20 77 69  ite its value wi
1d8b0 74 68 20 4e 55 4c 4c 2c 20 74 6f 20 70 72 65 76  th NULL, to prev
1d8c0 65 6e 74 0a 20 20 20 20 2a 2a 20 77 61 72 6e 69  ent.    ** warni
1d8d0 6e 67 73 20 66 72 6f 6d 20 4d 53 41 4e 2e 20 2a  ngs from MSAN. *
1d8e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
1d8f0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
1d900 2d 31 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  -1);.  }.  asser
1d910 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  t( u<=pKeyInfo->
1d920 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 20 29 3b  nKeyField + 1 );
1d930 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
1d940 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1d950 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1d960 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1d970 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1d980 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1d990 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1d9a0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1d9b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d9c0 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1d9d0 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1d9e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1d9f0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1da00 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1da10 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1da20 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1da30 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1da40 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1da50 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1da60 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1da70 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1da80 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1da90 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1daa0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1dab0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1dac0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1dad0 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1dae0 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1daf0 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1db00 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1db10 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1db20 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1db30 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1db40 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1db50 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1db60 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1db70 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1db80 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1db90 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1dba0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1dbb0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1dbc0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1dbd0 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1dbe0 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1dbf0 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1dc00 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1dc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1dc20 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1dc30 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1dc40 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1dc50 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1dc60 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1dc70 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1dc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1dc90 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1dca0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1dcb0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1dcc0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1dcd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1dce0 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1dcf0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1dd00 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1dd10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1dd20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1dd30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1dd40 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1dd50 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1dd60 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1dd70 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1dd80 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1dd90 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1dda0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1ddb0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1ddc0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1ddd0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1dde0 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1ddf0 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1de00 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1de10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1de20 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1de30 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1de40 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1de50 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1de60 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1de70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1de80 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1de90 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1dea0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1deb0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1dec0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1ded0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1dee0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1def0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1df00 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1df10 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1df20 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1df30 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1df40 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1df50 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1df60 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1df70 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1df80 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1df90 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1dfa0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1dfb0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1dfc0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1dfd0 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1dfe0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1dff0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1e000 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1e010 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1e020 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1e030 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1e040 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1e050 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1e060 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1e070 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1e080 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1e090 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1e0a0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1e0b0 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1e0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e0d0 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1e0e0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1e0f0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1e100 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1e110 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ield || CORRUPT_
1e120 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1e130 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1e140 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1e150 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1e160 4b 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  KeyField>0 );.  
1e170 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1e180 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1e190 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1e1a0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1e1b0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1e1c0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1e1d0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1e1e0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1e1f0 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1e200 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1e210 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1e220 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1e230 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1e240 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1e250 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1e260 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1e270 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1e280 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1e290 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1e2a0 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1e2b0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1e2c0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1e2d0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1e2e0 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1e2f0 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1e300 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1e310 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1e320 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1e330 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1e340 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1e350 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1e360 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1e370 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1e380 69 66 28 20 64 31 2b 28 75 36 34 29 73 65 72 69  if( d1+(u64)seri
1e390 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 36 34 29  al_type1+2>(u64)
1e3a0 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
1e3b0 2b 28 75 36 34 29 73 71 6c 69 74 65 33 56 64 62  +(u64)sqlite3Vdb
1e3c0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1e3d0 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 36  erial_type1)>(u6
1e3e0 34 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a  4)nKey1 .    ){.
1e3f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e400 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
1e410 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
1e420 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
1e430 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
1e440 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e450 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1e460 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
1e470 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
1e480 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
1e490 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1e4a0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1e4b0 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
1e4c0 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
1e4f0 6e 41 6c 6c 46 69 65 6c 64 3e 69 20 3f 20 70 4b  nAllField>i ? pK
1e500 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1e510 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
1e520 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
1e530 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1e540 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1e550 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1e560 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  */.      if( pKe
1e570 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1e580 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1e590 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e  rc = -rc;  /* In
1e5a0 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
1e5b0 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72  for DESC sort or
1e5c0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  der. */.      }.
1e5d0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67        goto debug
1e5e0 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20  CompareEnd;.    
1e5f0 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68  }.    i++;.  }wh
1e600 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
1e610 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1e620 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ield );..  /* No
1e630 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1e640 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1e650 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1e660 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1e670 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1e680 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1e690 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1e6a0 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1e6b0 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1e6c0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1e6d0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1e6e0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1e6f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e700 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1e710 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1e720 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1e730 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
1e740 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1e750 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1e760 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1e770 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1e780 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1e790 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1e7a0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
1e7b0 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  c = pPKey2->defa
1e7c0 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f  ult_rc;..debugCo
1e7d0 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20  mpareEnd:.  if( 
1e7e0 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30  desiredResult==0
1e7f0 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75   && rc==0 ) retu
1e800 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1e810 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72  redResult<0 && r
1e820 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c<0 ) return 1;.
1e830 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1e840 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20  ult>0 && rc>0 ) 
1e850 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1e860 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1e870 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65  urn 1;.  if( pKe
1e880 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1e890 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1e8a0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
1e8b0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1e8c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1e8d0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1e8e0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
1e8f0 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
1e900 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
1e910 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
1e920 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
1e930 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
1e940 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1e950 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
1e960 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
1e970 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69  pKeyInfo->nAllFi
1e980 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1e990 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1e9a0 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1e9b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1e9c0 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1e9d0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1e9e0 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1e9f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1ea00 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1ea10 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1ea20 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1ea30 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1ea40 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1ea50 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1ea60 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 4b  t the KeyInfo.nK
1ea70 65 79 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e  eyField or KeyIn
1ea80 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 76 61 6c  fo.nAllField val
1ea90 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65  ues were compute
1eaa0 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79  d.** incorrectly
1eab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1eac0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1ead0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1eae0 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  s(.  int nKey, c
1eaf0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1eb00 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
1eb10 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20   to verify */ . 
1eb20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a   const KeyInfo *
1eb30 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f  pKeyInfo       /
1eb40 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77  * Compare size w
1eb50 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f  ith this KeyInfo
1eb60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69   */.){.  int nFi
1eb70 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73  eld = 0;.  u32 s
1eb80 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b  zHdr;.  u32 idx;
1eb90 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a  .  u32 notUsed;.
1eba0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1ebb0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1ebc0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ebd0 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28  ar*)pKey;..  if(
1ebe0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1ebf0 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65  turn;.  idx = ge
1ec00 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1ec10 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74  szHdr);.  assert
1ec20 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  ( nKey>=0 );.  a
1ec30 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75  ssert( szHdr<=(u
1ec40 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69  32)nKey );.  whi
1ec50 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b  le( idx<szHdr ){
1ec60 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1ec70 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78  arint32(aKey+idx
1ec80 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20  , notUsed);.    
1ec90 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20  nField++;.  }.  
1eca0 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c  assert( nField <
1ecb0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  = pKeyInfo->nAll
1ecc0 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1ecd0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1ece0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1ecf0 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1ed00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ed10 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1ed20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1ed30 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1ed40 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1ed50 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1ed60 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1ed70 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1ed80 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1ed90 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1eda0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1edb0 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1edc0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1edd0 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1ede0 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1edf0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1ee00 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1ee10 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1ee20 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1ee30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1ee40 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1ee50 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1ee60 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1ee70 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1ee80 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1ee90 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1eea0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1eeb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1eec0 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1eed0 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1eee0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1eef0 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1ef00 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1ef10 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1ef20 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1ef30 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1ef40 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1ef50 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1ef60 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1ef70 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1ef80 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1ef90 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1efa0 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1efb0 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1efc0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1efd0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1efe0 31 2c 20 2a 76 32 3b 0a 20 20 20 20 4d 65 6d 20  1, *v2;.    Mem 
1eff0 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1f000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1f010 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1f020 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1f030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f040 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1f050 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1f060 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1f070 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1f080 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1f090 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1f0a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1f0b0 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1f0c0 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1f0d0 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1f0e0 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1f0f0 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1f100 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1f110 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v2 = sqlite3Valu
1f120 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1f130 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c  alue*)&c2, pColl
1f140 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  ->enc);.    if( 
1f150 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1f160 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
1f170 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1f180 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1f190 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  PT;.      rc = 0
1f1a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f1b0 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
1f1c0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1f1d0 2c 20 63 31 2e 6e 2c 20 76 31 2c 20 63 32 2e 6e  , c1.n, v1, c2.n
1f1e0 2c 20 76 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , v2);.    }.   
1f1f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f200 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1f210 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f220 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1f230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
1f250 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72  ut pBlob is guar
1f260 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42  anteed to be a B
1f270 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lob that is not 
1f280 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d  marked.** with M
1f290 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e  EM_Zero.  Return
1f2a0 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c   true if it coul
1f2b0 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62  d be a zero-blob
1f2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f2d0 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20  isAllZero(const 
1f2e0 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
1f2f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1f300 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1f310 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72      if( z[i] ) r
1f320 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1f330 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1f340 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1f350 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1f360 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1f370 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1f380 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1f390 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1f3a0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1f3b0 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1f3c0 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1f3d0 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1f3e0 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1f3f0 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1f400 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1f410 6f 72 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f  or..*/.SQLITE_NO
1f420 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
1f430 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
1f440 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
1f450 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
1f460 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31   int c;.  int n1
1f470 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74   = pB1->n;.  int
1f480 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20   n2 = pB2->n;.. 
1f490 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
1f4a0 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f  le to have a Blo
1f4b0 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73  b value that has
1f4c0 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63   some non-zero c
1f4d0 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c  ontent.  ** foll
1f4e0 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e  owed by zero con
1f4f0 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20  tent.  But that 
1f500 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f  only comes up fo
1f510 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20  r Blobs formed. 
1f520 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61   ** by the OP_Ma
1f530 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c  keRecord opcode,
1f540 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20   and such Blobs 
1f550 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65 64  never get passed
1f560 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
1f570 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20  e3MemCompare(). 
1f580 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  */.  assert( (pB
1f590 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  1->flags & MEM_Z
1f5a0 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30  ero)==0 || n1==0
1f5b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1f5c0 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B2->flags & MEM_
1f5d0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d  Zero)==0 || n2==
1f5e0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31  0 );..  if( (pB1
1f5f0 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61  ->flags|pB2->fla
1f600 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  gs) & MEM_Zero )
1f610 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66  {.    if( pB1->f
1f620 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67  lags & pB2->flag
1f630 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
1f640 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31        return pB1
1f650 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d  ->u.nZero - pB2-
1f660 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65  >u.nZero;.    }e
1f670 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61  lse if( pB1->fla
1f680 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1f690 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c  .      if( !isAl
1f6a0 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42  lZero(pB2->z, pB
1f6b0 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d  2->n) ) return -
1f6c0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f6d0 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e  pB1->u.nZero - n
1f6e0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
1f6f0 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1f700 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e  ro(pB1->z, pB1->
1f710 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  n) ) return +1;.
1f720 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20        return n1 
1f730 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  - pB2->u.nZero;.
1f740 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20      }.  }.  c = 
1f750 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70  memcmp(pB1->z, p
1f760 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e  B2->z, n1>n2 ? n
1f770 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63  2 : n1);.  if( c
1f780 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72   ) return c;.  r
1f790 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d  eturn n1 - n2;.}
1f7a0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d  ../*.** Do a com
1f7b0 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20  parison between 
1f7c0 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  a 64-bit signed 
1f7d0 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34  integer and a 64
1f7e0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  -bit floating-po
1f7f0 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20  int.** number.  
1f800 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1f810 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1f820 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
1f830 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68  (i64) is less th
1f840 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c  an,.** equal to,
1f850 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1f860 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75   the second (dou
1f870 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ble)..*/.static 
1f880 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  int sqlite3IntFl
1f890 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69  oatCompare(i64 i
1f8a0 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69  , double r){.  i
1f8b0 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f  f( sizeof(LONGDO
1f8c0 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a  UBLE_TYPE)>8 ){.
1f8d0 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54      LONGDOUBLE_T
1f8e0 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55  YPE x = (LONGDOU
1f8f0 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20  BLE_TYPE)i;.    
1f900 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e  if( x<r ) return
1f910 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72   -1;.    if( x>r
1f920 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1f930 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1f940 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a  lse{.    i64 y;.
1f950 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20      double s;.  
1f960 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32    if( r<-9223372
1f970 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29  036854775808.0 )
1f980 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1f990 69 66 28 20 72 3e 3d 39 32 32 33 33 37 32 30 33  if( r>=922337203
1f9a0 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1f9b0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1f9c0 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1f9d0 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1f9e0 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1f9f0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1fa00 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20  s = (double)i;. 
1fa10 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74     if( s<r ) ret
1fa20 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1fa30 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  s>r ) return +1;
1fa40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1fa50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
1fa60 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63  are the values c
1fa70 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  ontained by the 
1fa80 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  two memory cells
1fa90 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e  , returning.** n
1faa0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72  egative, zero or
1fab0 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65   positive if pMe
1fac0 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
1fad0 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1fae0 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d  eater.** than pM
1faf0 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64  em2. Sorting ord
1fb00 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72  er is NULL's fir
1fb10 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  st, followed by 
1fb20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72  numbers (integer
1fb30 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20  s.** and reals) 
1fb40 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c  sorted numerical
1fb50 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ly, followed by 
1fb60 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20  text ordered by 
1fb70 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  the collating.**
1fb80 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
1fb90 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62  and finally blob
1fba0 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65  's ordered by me
1fbb0 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77  mcmp()..**.** Tw
1fbc0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1fbd0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1fbe0 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  al by this funct
1fbf0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1fc00 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f  te3MemCompare(co
1fc10 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20  nst Mem *pMem1, 
1fc20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
1fc30 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20  , const CollSeq 
1fc40 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66  *pColl){.  int f
1fc50 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
1fc60 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
1fc70 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  f1 = pMem1->flag
1fc80 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d  s;.  f2 = pMem2-
1fc90 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e  >flags;.  combin
1fca0 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32  ed_flags = f1|f2
1fcb0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
1fcc0 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77  ite3VdbeMemIsRow
1fcd0 53 65 74 28 70 4d 65 6d 31 29 20 26 26 20 21 73  Set(pMem1) && !s
1fce0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52  qlite3VdbeMemIsR
1fcf0 6f 77 53 65 74 28 70 4d 65 6d 32 29 20 29 3b 0a  owSet(pMem2) );.
1fd00 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61   .  /* If one va
1fd10 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20  lue is NULL, it 
1fd20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1fd30 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20   other. If both 
1fd40 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20  values.  ** are 
1fd50 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  NULL, return 0..
1fd60 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1fd70 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  ned_flags&MEM_Nu
1fd80 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
1fd90 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d   (f2&MEM_Null) -
1fda0 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   (f1&MEM_Null);.
1fdb0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61    }..  /* At lea
1fdc0 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  st one of the tw
1fdd0 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75  o values is a nu
1fde0 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mber.  */.  if( 
1fdf0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
1fe00 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1fe10 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 20 29 7b  |MEM_IntReal) ){
1fe20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
1fe30 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20  ombined_flags & 
1fe40 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 74  MEM_Int );.    t
1fe50 65 73 74 63 61 73 65 28 20 63 6f 6d 62 69 6e 65  estcase( combine
1fe60 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  d_flags & MEM_Re
1fe70 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
1fe80 73 65 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  se( combined_fla
1fe90 67 73 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c  gs & MEM_IntReal
1fea0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20   );.    if( (f1 
1feb0 26 20 66 32 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  & f2 & (MEM_Int|
1fec0 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30  MEM_IntReal))!=0
1fed0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
1fee0 73 65 28 20 66 31 20 26 20 66 32 20 26 20 4d 45  se( f1 & f2 & ME
1fef0 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 74  M_Int );.      t
1ff00 65 73 74 63 61 73 65 28 20 66 31 20 26 20 66 32  estcase( f1 & f2
1ff10 20 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29   & MEM_IntReal )
1ff20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1ff30 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1ff40 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1ff50 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1ff60 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1ff70 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .i ) return +1;.
1ff80 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1ff90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1ffa0 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61  1 & f2 & MEM_Rea
1ffb0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1ffc0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20  f( pMem1->u.r < 
1ffd0 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1ffe0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1fff0 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70  ( pMem1->u.r > p
20000 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
20010 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
20020 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
20030 20 69 66 28 20 28 66 31 26 28 4d 45 4d 5f 49 6e   if( (f1&(MEM_In
20040 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29 29 21  t|MEM_IntReal))!
20050 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
20060 63 61 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49  case( f1 & MEM_I
20070 6e 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  nt );.      test
20080 63 61 73 65 28 20 66 31 20 26 20 4d 45 4d 5f 49  case( f1 & MEM_I
20090 6e 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  ntReal );.      
200a0 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
200b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
200c0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
200d0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
200e0 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
200f0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
20100 73 65 20 69 66 28 20 28 66 32 26 28 4d 45 4d 5f  se if( (f2&(MEM_
20110 49 6e 74 7c 4d 45 4d 5f 49 6e 74 52 65 61 6c 29  Int|MEM_IntReal)
20120 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
20130 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
20140 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
20150 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20  turn -1;.       
20160 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
20170 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
20180 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
20190 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
201a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
201b0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
201c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
201d0 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
201e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
201f0 28 66 32 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  (f2&(MEM_Int|MEM
20200 5f 49 6e 74 52 65 61 6c 29 29 21 3d 30 20 29 7b  _IntReal))!=0 ){
20210 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20220 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 20  e( f2 & MEM_Int 
20230 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
20240 61 73 65 28 20 66 32 20 26 20 4d 45 4d 5f 49 6e  ase( f2 & MEM_In
20250 74 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20  tReal );.       
20260 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33   return -sqlite3
20270 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
20280 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem2->u.i, pMem
20290 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  1->u.r);.      }
202a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
202b0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
202c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
202d0 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n +1;.  }..  /* 
202e0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
202f0 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
20300 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
20310 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
20320 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
20330 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
20340 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
20350 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
20360 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
20370 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
20380 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
20390 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
203a0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
203b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
203c0 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
203d0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
203e0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
203f0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
20400 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
20410 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d  2->enc || pMem1-
20420 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20430 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
20440 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
20450 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20  ITE_UTF8 || .   
20460 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e           pMem1->
20470 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
20480 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e  6LE || pMem1->en
20490 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
204a0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  E );..    /* The
204b0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
204c0 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  nce must be defi
204d0 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ned at this poin
204e0 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a  t, even if.    *
204f0 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74  * the user delet
20500 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
20510 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
20520 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
20530 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69   is.    ** compi
20540 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f  led (this was no
20550 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  t always the cas
20560 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  e)..    */.    a
20570 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c  ssert( !pColl ||
20580 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a   pColl->xCmp );.
20590 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
205a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
205b0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
205c0 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  ing(pMem1, pMem2
205d0 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , pColl, 0);.   
205e0 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e   }.    /* If a N
205f0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20  ULL pointer was 
20600 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
20610 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  llate function, 
20620 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20  fall through.   
20630 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20   ** to the blob 
20640 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d  case and use mem
20650 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20  cmp().  */.  }. 
20660 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65  .  /* Both value
20670 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e  s must be blobs.
20680 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20    Compare using 
20690 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
206a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c  return sqlite3Bl
206b0 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c  obCompare(pMem1,
206c0 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   pMem2);.}.../*.
206d0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
206e0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
206f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
20700 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74   a serial-type t
20710 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  hat.** correspon
20720 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ds to an integer
20730 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65   - all values be
20740 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e  tween 1 and 9 in
20750 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65  clusive .** exce
20760 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64  pt 7. The second
20770 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
20780 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
20790 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a  n integer value.
207a0 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63  ** serialized ac
207b0 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61  cording to seria
207c0 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e  l_type. This fun
207d0 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
207e0 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  es.** and return
207f0 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a  s the value..*/.
20800 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52  static i64 vdbeR
20810 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75  ecordDecodeInt(u
20820 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
20830 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b  const u8 *aKey){
20840 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65  .  u32 y;.  asse
20850 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
20860 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  | (serial_type>=
20870 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  1 && serial_type
20880 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=9 && serial_ty
20890 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74  pe!=7) );.  swit
208a0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
208b0 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20  ){.    case 0:. 
208c0 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20     case 1:.     
208d0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
208e0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
208f0 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45   return ONE_BYTE
20900 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20910 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65  case 2:.      te
20920 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
20930 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
20940 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e  turn TWO_BYTE_IN
20950 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
20960 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 3:.      testc
20970 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
20980 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
20990 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  n THREE_BYTE_INT
209a0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
209b0 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   4: {.      test
209c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
209d0 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20  80 );.      y = 
209e0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
209f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Key);.      retu
20a00 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26  rn (i64)*(int*)&
20a10 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  y;.    }.    cas
20a20 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 5: {.      tes
20a30 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
20a40 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
20a50 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  urn FOUR_BYTE_UI
20a60 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
20a70 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
20a80 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
20a90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
20aa0 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20  : {.      u64 x 
20ab0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
20ac0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
20ad0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
20ae0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20  0x80 );.      x 
20af0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
20b00 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
20b10 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  4);.      return
20b20 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b   (i64)*(i64*)&x;
20b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
20b40 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
20b50 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e - 8);.}../*.**
20b60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
20b70 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
20b80 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
20b90 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
20ba0 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
20bb0 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
20bc0 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
20bd0 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
20be0 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
20bf0 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
20c00 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
20c10 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
20c20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
20c30 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
20c40 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
20c50 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
20c60 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  eated by the OP_
20c70 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
20c80 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
20c90 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
20ca0 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
20cb0 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
20cc0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
20cd0 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
20ce0 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  Record..**.** If
20cf0 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20   argument bSkip 
20d00 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  is non-zero, it 
20d10 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
20d20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
20d30 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d  lready.** determ
20d40 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
20d50 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
20d60 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
20d70 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
20d80 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
20d90 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
20da0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
20db0 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a  fields. If all .
20dc0 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ** fields that a
20dd0 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65  ppear in both ke
20de0 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  ys are equal, th
20df0 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  en pPKey2->defau
20e00 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74  lt_rc is .** ret
20e10 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
20e20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
20e30 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65  ion is discovere
20e40 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65  d, set pPKey2->e
20e50 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51  rrCode to .** SQ
20e60 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
20e70 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e   return 0. If an
20e80 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
20e90 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70  countered, .** p
20ea0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69  PKey2->errCode i
20eb0 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
20ec0 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74  NOMEM and, if it
20ed0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
20ee0 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c  e.** malloc-fail
20ef0 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64  ed flag set on d
20f00 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
20f10 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
20f20 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ->db)..*/.int sq
20f30 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20f40 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a  ompareWithSkip(.
20f50 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
20f60 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
20f70 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
20f80 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20f90 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20  d *pPKey2,      
20fa0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
20fb0 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20  */.  int bSkip  
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
20fe0 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20   skip the first 
20ff0 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33  field */.){.  u3
21000 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21020 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
21030 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
21040 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
21050 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21070 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66   Index of next f
21080 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  ield to compare 
21090 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
210c0 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
210d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
210e0 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20  idx1;           
210f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21100 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
21110 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  ype in header */
21120 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
21150 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68  ue */.  Mem *pRh
21160 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  s = pPKey2->aMem
21170 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
21180 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
21190 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
211a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
211b0 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
211c0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
211d0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
211e0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
211f0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
21200 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
21210 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
21220 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
21230 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
21240 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
21250 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
21260 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
21270 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
21280 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
21290 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
212a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
212b0 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
212c0 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
212d0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
212e0 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
212f0 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
21300 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
21310 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
21320 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
21330 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
21340 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
21350 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
21360 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
21370 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
21380 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
21390 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
213a0 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
213b0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
213c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
213d0 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
213e0 79 31 20 29 7b 20 0a 20 20 20 20 70 50 4b 65 79  y1 ){ .    pPKey
213f0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
21400 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
21410 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
21420 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69   0;  /* Corrupti
21430 6f 6e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 56 56 41  on */.  }..  VVA
21440 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
21450 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
21460 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
21470 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
21480 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
21490 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
214a0 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b 65  >nAllField>=pPKe
214b0 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20  y2->nField .    
214c0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
214d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
214e0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
214f0 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
21500 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
21510 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65  2->pKeyInfo->nKe
21520 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  yField>0 );.  as
21530 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
21540 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
21550 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
21560 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
21570 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e      /* RHS is an
21580 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
21590 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
215a0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 49  & (MEM_Int|MEM_I
215b0 6e 74 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 20  ntReal) ){.     
215c0 20 74 65 73 74 63 61 73 65 28 20 70 52 68 73 2d   testcase( pRhs-
215d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
215e0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
215f0 73 65 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  se( pRhs->flags 
21600 26 20 4d 45 4d 5f 49 6e 74 52 65 61 6c 20 29 3b  & MEM_IntReal );
21610 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
21620 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
21630 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21640 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
21650 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
21660 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
21670 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
21680 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
21690 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
216a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
216b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
216c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
216d0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
216e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
216f0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
21700 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
21710 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
21720 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
21730 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
21740 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
21750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21760 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
21770 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
21780 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
21790 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
217a0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
217b0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
217c0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
217d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
217e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
217f0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
21800 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
21810 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
21820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21830 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
21840 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
21850 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
21860 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
21870 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
21880 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
21890 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
218a0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
218b0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
218c0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
218d0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
218e0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
218f0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
21900 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
21910 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
21920 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
21930 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
21940 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
21950 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
21960 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
21970 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
21980 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
21990 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
219a0 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
219b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
219c0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
219d0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
219e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
219f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
21a00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21a10 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
21a20 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
21a30 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
21a40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
21a50 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
21a60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
21a70 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
21a80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21a90 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
21aa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
21ab0 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
21ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
21ad0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
21ae0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
21af0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
21b00 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
21b10 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
21b20 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
21b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
21b50 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
21b60 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
21b70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
21b80 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
21b90 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
21ba0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
21bb0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
21bc0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
21bd0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
21be0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
21bf0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
21c00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
21c10 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
21c20 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
21c30 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
21c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21c50 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
21c60 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
21c70 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
21c80 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
21c90 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
21ca0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
21cb0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
21cc0 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
21cd0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
21ce0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
21cf0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
21d00 6e 4b 65 79 31 0a 20 20 20 20 20 20 20 20 20 7c  nKey1.         |
21d10 7c 20 28 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  | (pKeyInfo = pP
21d20 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 2d  Key2->pKeyInfo)-
21d30 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 69 0a 20 20  >nAllField<=i.  
21d40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21d50 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
21d60 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
21d70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21d80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
21d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21da0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
21db0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
21dc0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
21dd0 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
21de0 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
21df0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
21e00 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
21e10 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
21e20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
21e30 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
21e40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
21e50 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
21e60 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
21e70 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
21e80 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
21e90 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
21ea0 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
21eb0 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
21ec0 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
21ed0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21ef0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
21f00 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
21f10 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21f20 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
21f30 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
21f40 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
21f50 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
21f60 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
21f70 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
21f80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21f90 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
21fa0 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
21fb0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
21fc0 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
21fd0 61 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66  assert( (pRhs->f
21fe0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
21ff0 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d  ==0 || pRhs->n==
22000 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61  0 );.      getVa
22010 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
22020 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
22030 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22040 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
22050 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
22060 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
22070 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
22080 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
22090 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
220a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
220b0 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
220c0 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
220d0 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
220e0 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
220f0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
22100 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
22110 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
22120 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
22130 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
22140 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
22150 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
22160 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
22170 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
22180 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22190 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
221a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
221b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
221c0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
221d0 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d   }else if( pRhs-
221e0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
221f0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  o ){.          i
22200 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63  f( !isAllZero((c
22210 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79  onst char*)&aKey
22220 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20  1[d1],nStr) ){. 
22230 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22240 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
22250 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22260 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
22270 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
22280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
222a0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  int nCmp = MIN(n
222b0 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  Str, pRhs->n);. 
222c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
222d0 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
222e0 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
222f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22300 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72  c==0 ) rc = nStr
22310 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20   - pRhs->n;.    
22320 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22330 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
22340 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65  is null */.    e
22350 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61  lse{.      seria
22360 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
22370 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  dx1];.      rc =
22380 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30   (serial_type!=0
22390 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
223a0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
223b0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65   if( pPKey2->pKe
223c0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
223d0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
223e0 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
223f0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
22400 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
22410 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
22420 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
22430 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22440 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
22450 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
22460 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
22470 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22480 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
22490 20 20 20 20 69 66 28 20 69 3d 3d 70 50 4b 65 79      if( i==pPKey
224a0 32 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  2->nField ) brea
224b0 6b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  k;.    pRhs++;. 
224c0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
224d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
224e0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
224f0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
22500 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
22510 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
22520 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
22530 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 64 31  ned)szHdr1 && d1
22540 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
22550 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
22560 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
22570 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
22580 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
22590 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
225a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
225b0 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
225c0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
225d0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
225e0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
225f0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
22600 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
22610 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
22620 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
22630 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
22640 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
22650 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
22660 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
22670 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
22680 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
22690 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
226a0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
226b0 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
226c0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
226d0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
226e0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
226f0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
22700 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22710 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
22720 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
22730 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
22740 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  ) .       || pPK
22750 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
22760 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
22770 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
22780 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
22790 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
227a0 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
227b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
227c0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
227d0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
227e0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
227f0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
22800 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
22810 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
22820 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
22830 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
22840 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
22850 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
22860 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
22870 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
22880 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
22890 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
228a0 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
228b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
228c0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
228d0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
228e0 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
228f0 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
22900 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
22910 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
22920 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
22930 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
22940 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
22950 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
22960 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
22970 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
22980 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
22990 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
229a0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
229b0 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
229c0 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
229d0 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
229e0 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
229f0 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
22a00 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
22a10 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
22a20 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
22a30 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
22a40 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
22a50 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
22a60 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
22a70 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
22a80 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
22a90 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
22aa0 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
22ab0 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
22ac0 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
22ad0 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
22ae0 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
22af0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
22b00 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
22b10 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b  64 v;.  i64 lhs;
22b20 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
22b30 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
22b40 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
22b50 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
22b60 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
22b70 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
22b80 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
22b90 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
22ba0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
22bb0 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
22bc0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
22bd0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
22be0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
22bf0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
22c00 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
22c10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22c20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
22c30 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
22c40 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
22c50 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
22c60 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
22c70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
22c80 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
22c90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
22ca0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
22cb0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
22cc0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
22cd0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
22ce0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
22cf0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
22d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22d10 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
22d20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
22d30 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
22d40 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
22d50 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
22d60 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
22d70 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
22d80 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
22d90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22da0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
22db0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
22dc0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
22dd0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
22de0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
22df0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
22e00 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
22e10 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
22e20 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
22e30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22e40 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
22e50 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
22e60 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
22e70 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
22e80 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
22e90 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
22ea0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
22eb0 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
22ec0 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
22ed0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
22ee0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
22ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
22f00 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
22f10 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
22f20 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
22f30 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
22f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
22f50 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
22f60 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
22f70 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
22f80 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
22f90 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
22fa0 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
22fb0 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
22fc0 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
22fd0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
22fe0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
22ff0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
23000 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
23010 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
23020 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
23030 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
23040 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
23050 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
23060 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
23070 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
23080 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
23090 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
230a0 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
230b0 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
230c0 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
230d0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
230e0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
230f0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
23100 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
23110 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
23120 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
23130 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
23140 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
23150 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
23160 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
23170 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
23180 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79    }..  v = pPKey
23190 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
231a0 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20    if( v>lhs ){. 
231b0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
231c0 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r1;.  }else if(
231d0 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v<lhs ){.    re
231e0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
231f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
23200 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
23210 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
23220 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
23230 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
23240 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  l. Compare the t
23250 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20  railing .    ** 
23260 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20  fields.  */.    
23270 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
23280 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
23290 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
232a0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
232b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
232c0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
232d0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
232e0 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
232f0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
23300 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
23310 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
23320 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
23330 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
23340 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
23350 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
23360 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
23370 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 1;.  }..  ass
23380 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
23390 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
233a0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
233b0 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75  , res) );.  retu
233c0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
233d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
233e0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
233f0 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
23400 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
23410 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
23420 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
23430 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
23440 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
23450 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
23460 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
23470 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
23480 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
23490 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
234a0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
234b0 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
234c0 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
234d0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
234e0 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
234f0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
23500 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
23510 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
23520 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
23530 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
23540 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
23550 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
23560 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
23570 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
23580 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
23590 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
235a0 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
235b0 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
235c0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
235d0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
235e0 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  );.  vdbeAssertF
235f0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
23600 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
23610 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
23620 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
23630 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
23640 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
23650 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
23660 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
23670 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
23680 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
23690 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
236a0 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
236b0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
236c0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
236d0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
236e0 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
236f0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
23700 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
23710 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
23720 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
23730 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
23740 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
23750 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
23760 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
23770 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
23780 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
23790 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
237a0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
237b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
237c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
237d0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
237e0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
237f0 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
23800 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
23810 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
23820 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
23830 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
23840 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
23850 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
23860 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
23870 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
23880 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
23890 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
238a0 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
238b0 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
238c0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
238d0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
238e0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
238f0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
23900 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
23910 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
23920 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
23930 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20  ult_rc;.        
23940 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
23950 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
23960 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23970 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  res>0 ){.       
23980 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
23990 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
239a0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
239b0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20  Key2->r1;.      
239c0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
239d0 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  res>0 ){.      r
239e0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
239f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23a00 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
23a10 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r1;.    }.  }.. 
23a20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
23a30 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
23a40 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
23a50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20  Key2, res).     
23a60 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
23a70 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32         || pPKey2
23a80 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ->pKeyInfo->db->
23a90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
23aa0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
23ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23ac0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
23ad0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
23ae0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
23af0 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
23b00 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
23b10 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
23b20 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
23b30 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
23b40 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
23b50 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
23b60 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
23b70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
23b80 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
23b90 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
23ba0 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
23bb0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
23bc0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
23bd0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
23be0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
23bf0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
23c00 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
23c10 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
23c20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
23c30 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
23c40 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
23c50 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
23c60 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
23c70 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
23c80 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
23c90 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
23ca0 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
23cb0 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
23cc0 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
23cd0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
23ce0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
23cf0 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
23d00 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
23d10 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
23d20 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
23d30 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
23d40 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
23d50 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
23d60 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
23d70 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
23d80 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
23d90 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
23da0 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
23db0 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
23dc0 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
23dd0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
23de0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
23df0 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
23e00 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
23e10 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
23e20 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
23e30 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
23e40 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
23e50 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
23e60 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
23e70 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
23e80 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
23e90 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
23ea0 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
23eb0 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
23ec0 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
23ed0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
23ee0 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65  KeyInfo->nAllFie
23ef0 6c 64 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  ld<=13 ){.    in
23f00 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
23f10 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
23f20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
23f30 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
23f40 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
23f50 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
23f60 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
23f70 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
23f80 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
23f90 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
23fa0 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
23fb0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
23fc0 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
23fd0 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
23fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
23ff0 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
24000 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
24010 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
24020 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
24030 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
24040 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
24050 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
24060 4d 45 4d 5f 49 6e 74 52 65 61 6c 7c 4d 45 4d 5f  MEM_IntReal|MEM_
24070 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
24080 3d 30 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 4b  =0.     && p->pK
24090 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
240a0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
240b0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
240c0 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20   MEM_Str );.    
240d0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
240e0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
240f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
24100 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
24110 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  eRecordCompare;.
24120 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f  }../*.** pCur po
24130 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
24140 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
24150 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
24160 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
24170 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
24180 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
24190 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
241a0 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
241b0 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
241c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
241d0 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
241e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
241f0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
24200 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
24210 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
24220 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
24230 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
24240 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
24250 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
24260 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
24270 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
24280 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
24290 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
242a0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
242b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
242c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
242d0 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
242e0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
242f0 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
24300 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
24310 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
24320 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
24330 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
24340 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
24350 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
24360 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
24370 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
24380 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
24390 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
243a0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
243b0 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
243c0 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
243d0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
243e0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
243f0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
24400 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
24410 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
24420 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
24430 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
24440 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
24450 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
24460 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
24470 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
24480 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
24490 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
244a0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
244b0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
244c0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
244d0 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
244e0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
244f0 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
24500 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  ;.  assert( (nCe
24510 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
24520 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
24530 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
24540 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
24550 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
24560 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
24570 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
24580 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
24590 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
245a0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
245b0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
245c0 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
245d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
245e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
245f0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
24600 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
24610 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
24620 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
24630 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
24640 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
24650 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
24660 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24670 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
24680 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3e  testcase( szHdr>
24690 30 78 37 66 66 66 66 66 66 66 20 29 3b 0a 20 20  0x7fffffff );.  
246a0 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d 30 20 29  assert( m.n>=0 )
246b0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
246c0 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 7a 48 64  (szHdr<3 || szHd
246d0 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d 2e 6e 29  r>(unsigned)m.n)
246e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
246f0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
24700 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
24710 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
24720 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
24730 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
24740 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
24750 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
24760 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
24770 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
24780 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
24790 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
247a0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
247b0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
247c0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
247d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
247e0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
247f0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
24800 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
24810 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
24820 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
24830 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
24840 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
24850 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
24860 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
24870 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
24880 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
24890 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
248a0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
248b0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
248c0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
248d0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
248e0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
248f0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
24900 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
24910 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
24920 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
24930 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
24940 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
24950 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
24960 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
24970 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
24980 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
24990 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
249a0 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
249b0 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
249c0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
249d0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
249e0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
249f0 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
24a00 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
24a10 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
24a20 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
24a30 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
24a40 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
24a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
24a60 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
24a70 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
24a80 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
24a90 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
24aa0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
24ab0 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
24ac0 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
24ad0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
24ae0 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
24af0 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
24b00 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
24b10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
24b20 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
24b30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24b40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
24b50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
24b60 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
24b70 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
24b80 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
24b90 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
24ba0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
24bb0 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
24bc0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
24bd0 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
24be0 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
24bf0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
24c00 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
24c10 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
24c20 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
24c30 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
24c40 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
24c50 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
24c60 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
24c70 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
24c80 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
24c90 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
24ca0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
24cb0 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
24cc0 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
24cd0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
24ce0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
24cf0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
24d00 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
24d10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
24d20 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
24d30 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
24d40 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
24d50 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
24d60 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
24d70 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
24d80 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
24d90 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
24da0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
24db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
24dc0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24dd0 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
24de0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
24df0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
24e00 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
24e10 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
24e20 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
24e30 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
24e40 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
24e50 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
24e60 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
24e90 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
24ea0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
24eb0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
24ec0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
24ed0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20  or *pCur;.  Mem 
24ee0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  m;..  assert( pC
24ef0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
24f00 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
24f10 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  Cur = pC->uc.pCu
24f20 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rsor;.  assert( 
24f30 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24f40 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
24f50 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20  );.  nCellKey = 
24f60 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
24f70 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
24f80 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c   /* nCellKey wil
24f90 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77  l always be betw
24fa0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66  een 0 and 0xffff
24fb0 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20  ffff because of 
24fc0 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61  the way.  ** tha
24fd0 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  t btreeParseCell
24fe0 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Ptr() and sqlite
24ff0 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61  3GetVarint32() a
25000 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a  re implemented *
25010 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  /.  if( nCellKey
25020 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
25030 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0x7fffffff ){.  
25040 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20    *res = 0;.    
25050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25060 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25070 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
25080 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
25090 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
250a0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
250b0 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
250c0 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69  ellKey, &m);.  i
250d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
250e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
250f0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
25100 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
25110 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  hSkip(m.n, m.z, 
25120 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
25130 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
25140 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
25150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25160 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
25170 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
25180 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
25190 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
251a0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
251b0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
251c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
251d0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
251e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
251f0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
25200 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
25210 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
25220 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25230 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
25240 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
25250 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
25260 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
25270 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
25280 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
25290 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
252a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
252b0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
252c0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
252d0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
252e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
252f0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
25300 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
25310 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
25320 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
25330 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
25340 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25350 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
25360 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
25370 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
25380 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
25390 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
253a0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
253b0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
253c0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
253d0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
253e0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
253f0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
25400 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
25410 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
25420 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
25430 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
25440 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
25450 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
25460 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
25470 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
25480 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
25490 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
254a0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
254b0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2a 0a 2a  s obsolete..**.*
254c0 2a 20 49 66 20 69 43 6f 64 65 20 69 73 20 31 2c  * If iCode is 1,
254d0 20 74 68 65 6e 20 65 78 70 69 72 61 74 69 6f 6e   then expiration
254e0 20 69 73 20 61 64 76 69 73 6f 72 79 2e 20 20 54   is advisory.  T
254f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 68 6f  he statement sho
25500 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 72 65 70  uld.** be reprep
25510 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
25520 67 20 72 65 73 74 61 72 74 65 64 2c 20 62 75 74  g restarted, but
25530 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
25540 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 69 74 20  y running.** it 
25550 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 75  is allowed to ru
25560 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  n to completion.
25570 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e 61 6c 6c  .**.** Internall
25580 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
25590 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 56   just sets the V
255a0 64 62 65 2e 65 78 70 69 72 65 64 20 66 6c 61 67  dbe.expired flag
255b0 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 65 70 61   on all.** prepa
255c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  red statements. 
255d0 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
255e0 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 69 6d 6d   to 1 for an imm
255f0 65 64 69 61 74 65 20 65 78 70 69 72 61 74 69 6f  ediate expiratio
25600 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 74 6f 20  n.** and set to 
25610 32 20 66 6f 72 20 61 6e 20 61 64 76 69 73 6f 72  2 for an advisor
25620 79 20 65 78 70 69 72 61 74 69 6f 6e 2e 0a 2a 2f  y expiration..*/
25630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
25640 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
25650 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
25660 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20  b, int iCode){. 
25670 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
25680 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
25690 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
256a0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
256b0 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a 7d 0a 0a  iCode+1;.  }.}..
256c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
256d0 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
256e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
256f0 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
25700 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
25710 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
25720 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   v->db;.}../*.**
25730 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 49   Return the SQLI
25740 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 67 73  TE_PREPARE flags
25750 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a 2f 0a   for a Vdbe..*/.
25760 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  u8 sqlite3VdbePr
25770 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 65 20  epareFlags(Vdbe 
25780 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
25790 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  >prepFlags;.}../
257a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
257b0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
257c0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
257d0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
257e0 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
257f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
25800 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
25810 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
25820 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
25830 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
25840 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
25850 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
25860 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
25870 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
25880 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
25890 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
258a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
258b0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
258c0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
258d0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
258e0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
258f0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
25900 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
25910 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
25920 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
25930 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
25940 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
25950 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
25960 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
25970 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
25980 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 61  r[iVar-1];.    a
25990 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e 66  ssert( (v->db->f
259a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e  lags & SQLITE_En
259b0 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b 0a  ableQPSG)==0 );.
259c0 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
259d0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
259e0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
259f0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
25a00 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
25a10 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
25a20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
25a30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25a40 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
25a50 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
25a60 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
25a70 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
25a80 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
25a90 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
25aa0 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
25ab0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25ac0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
25ad0 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
25ae0 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
25af0 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
25b00 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
25b10 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
25b20 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
25b30 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
25b40 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
25b50 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
25b60 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
25b70 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
25b80 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
25b90 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
25ba0 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
25bb0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
25bc0 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d 3e  assert( (v->db->
25bd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
25be0 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 3b  nableQPSG)==0 );
25bf0 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 32 20  .  if( iVar>=32 
25c00 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
25c10 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 30 3b  k |= 0x80000000;
25c20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
25c30 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
25c40 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
25c50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
25c60 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  ause a function 
25c70 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  to throw an erro
25c80 72 20 69 66 20 69 74 20 77 61 73 20 63 61 6c 6c  r if it was call
25c90 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 75 6e   from OP_PureFun
25ca0 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  c.** rather than
25cb0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OP_Function..**
25cc0 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e 63 20  .** OP_PureFunc 
25cd0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
25ce0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
25cf0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c 20 61  deterministic, a
25d00 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 68 72  nd should.** thr
25d10 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  ow an error if i
25d20 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 75 74  t is given input
25d30 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b  s that would mak
25d40 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  e it non-determi
25d50 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 73 20  nistic..** This 
25d60 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
25d70 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d 65 20  ed by date/time 
25d80 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
25d90 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  se non-determini
25da0 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 65 73  stic.** features
25db0 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 2e 0a   such as 'now'..
25dc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  */.int sqlite3No
25dd0 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 74 65  tPureFunc(sqlite
25de0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
25df0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
25e00 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
25e10 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78  STAT4.  if( pCtx
25e20 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 65 74  ->pVdbe==0 ) ret
25e30 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 1;.#endif.  
25e40 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 65 2d  if( pCtx->pVdbe-
25e50 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 5d 2e  >aOp[pCtx->iOp].
25e60 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 65 46  opcode==OP_PureF
25e70 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
25e80 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
25e90 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 22 6e  pCtx, .       "n
25ea0 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
25eb0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 6e 64   function in ind
25ec0 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  ex expression or
25ed0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
25ee0 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 3b 0a  t",.       -1);.
25ef0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
25f00 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
25f10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25f20 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
25f30 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
25f40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
25f50 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
25f60 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
25f70 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
25f80 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
25f90 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
25fa0 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
25fb0 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
25fc0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
25fd0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
25fe0 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
25ff0 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
26000 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
26010 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
26020 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
26030 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
26040 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
26050 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26060 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
26070 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
26080 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
26090 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
260a0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
260b0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
260c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
260d0 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
260e0 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
260f0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
26100 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
26110 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
26120 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
26130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
26140 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
26150 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
26160 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
26170 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
26180 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
26190 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
261a0 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
261b0 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
261c0 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
261d0 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
261e0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
261f0 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
26200 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
26210 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
26220 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
26230 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
26240 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
26250 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
26260 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
26270 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
26280 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
26290 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
262a0 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
262b0 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
262c0 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 55  b, int nField, U
262d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
262e0 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
262f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
26300 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20  (i=0; i<nField; 
26310 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20  i++){.      Mem 
26320 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
26330 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
26340 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73  Mem->zMalloc ) s
26350 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
26360 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
26370 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
26380 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20  reeNN(db, p);.  
26390 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
263a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
263b0 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
263c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
263d0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
263e0 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
263f0 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
26400 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
26410 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
26420 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
26430 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
26440 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
26450 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
26460 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
26470 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
26480 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
26490 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
264a0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
264b0 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
264c0 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
264d0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
264e0 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
264f0 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
26500 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
26510 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
26520 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
26530 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26550 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
26560 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
26570 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
26580 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
26590 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
265a0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
265b0 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
265c0 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
265d0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
265e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
265f0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
26600 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
26610 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26620 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
26630 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
26640 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
26650 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
26660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
26670 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
26680 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266a0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
266b0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
266c0 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
266d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
266e0 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
266f0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
26700 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
26710 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
26720 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
26730 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
26740 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
26750 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
26760 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
26770 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
26780 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
26790 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
267a0 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
267b0 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
267c0 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
267d0 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
267e0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
267f0 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
26800 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
26810 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
26820 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
26830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
26840 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
26850 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
26860 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
26870 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
26880 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
26890 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
268a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
268b0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
268c0 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
268d0 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
268e0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
268f0 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
26900 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
26910 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
26920 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
26930 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
26940 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
26950 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
26960 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
26970 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
26980 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
26990 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
269a0 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
269b0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
269c0 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 3d  info.nKeyField =
269d0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70   pTab->nCol;.  p
269e0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
269f0 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  .aSortOrder = (u
26a00 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65  8*)&fakeSortOrde
26a10 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  r;.  preupdate.i
26a20 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key1 = iKey1;.  
26a30 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20  preupdate.iKey2 
26a40 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70  = iKey2;.  preup
26a50 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62  date.pTab = pTab
26a60 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  ;..  db->pPreUpd
26a70 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65  ate = &preupdate
26a80 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
26a90 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  teCallback(db->p
26aa0 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62  PreUpdateArg, db
26ab0 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c  , op, zDb, zTbl,
26ac0 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a   iKey1, iKey2);.
26ad0 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
26ae0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
26af0 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64  bFree(db, preupd
26b00 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20  ate.aRecord);.  
26b10 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
26b20 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b  (db, preupdate.k
26b30 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64  eyinfo.nKeyField
26b40 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  +1, preupdate.pU
26b50 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
26b60 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
26b70 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
26b80 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 2c 20  fo.nKeyField+1, 
26b90 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
26ba0 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
26bb0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
26bc0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26bd0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
26be0 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
26bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26c00 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
26c10 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
26c20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
26c30 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 72  3DbFreeNN(db, pr
26c40 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20  eupdate.aNew);. 
26c50 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
26c60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
26c70 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a     UPDATE_HOOK */.